Netzwerk-Graph-Objekt lesen / schreiben

8

Ich versuche, mit einem überdimensionalen NetworkX Graph-Objekt mit hunderten von Millionen von Knoten umzugehen. Ich möchte in der Lage sein, es in Datei zu schreiben, um nicht meinen ganzen Computerspeicher zu verbrauchen. Ich muss jedoch ständig über vorhandene Knoten suchen, Kanten aktualisieren usw.

Gibt es dafür eine gute Lösung? Ich bin mir nicht sicher, wie es mit einem der Dateiformate funktionieren würde, die auf Ссылка

bereitgestellt werden

Die einzige Lösung, die ich mir vorstellen kann, ist, jeden Knoten als separate Datei mit Verweisen auf andere Knoten im Dateisystem zu speichern - auf diese Weise wird beim Öffnen eines Knotens zur Untersuchung der Speicher nicht überlastet. Gibt es ein vorhandenes Dateisystem für große Datenmengen (z. B. PyTables), um dies zu tun, ohne meinen eigenen Standardcode zu schreiben?

    
ejang 14.06.2012, 00:08
quelle

2 Antworten

2

Wenn Sie dies als ein NetworkX-Diagramm erstellt haben, ist es bereits im Speicher vorhanden. Für dieses große Diagramm ist es wahrscheinlich, dass Sie etwas Ähnliches wie das, was Sie mit separaten Dateien vorgeschlagen haben, tun müssen. Anstatt jedoch separate Dateien zu verwenden, verwende ich eine Datenbank, um jeden Knoten mit vielen-zu-vielen Verbindungen zwischen Knoten zu speichern. Mit anderen Worten, Sie würden eine Tabelle mit Knoten und eine Tabelle mit Kanten haben, um dann nach den Nachbarn eines bestimmten Knotens zu fragen, die Sie einfach nach Kanten abfragen könnten, die diesen bestimmten Knoten an beiden Enden haben. Das sollte schnell gehen, obwohl ich mir nicht sicher bin, ob Sie die Analysefunktionen von NetworkX nutzen können, ohne zuerst das gesamte Netzwerk im Speicher zu erstellen.

    
LuisZaman 06.08.2012, 20:10
quelle
18

Probieren Sie pickle ; Es ist entworfen, um beliebige Objekte zu serialisieren.

Ein Beispiel zum Erstellen eines DiGraph und zum Serialisieren in eine Datei:

%Vor%

Ein Beispiel zum Laden von DiGraph aus einer Datei:

%Vor%

Ausgabe:

%Vor%

Wenn das nicht effizient genug ist, würde ich Ihre eigene Routine zum Serialisieren schreiben:

  1. Kanten und
  2. Knoten (falls ein Knoten keine Kanten berührt).

Beachten Sie, dass die Verwendung von Listenkomprehensionen, wenn möglich, viel effizienter sein kann (anstelle von Standardfor-Schleifen).

Wenn dies nicht effizient genug ist, würde ich eine C ++ - Routine in Python aufrufen: Ссылка

    
user 06.07.2012 01:26
quelle

Tags und Links