Frage

Ich bin begeistert davon, Python und Networkx für die Analyse von Grafiken zu verwenden. Wenn ich mehr lerne, möchte ich immer mehr Daten verwenden (ich denke, ich werde ein Datenjunkie :-). Schließlich denke ich, dass mein NetworkX -Diagramm (das als Diktat von DICT gespeichert wird) den Speicher auf meinem System überschreiten wird. Ich weiß, dass ich wahrscheinlich einfach mehr Speicher hinzufügen kann, aber ich habe mich gefragt, ob es eine Möglichkeit gab, NetworkX in HBase oder eine ähnliche Lösung zu integrieren.

Ich sah mich um und konnte nichts wirklich finden, aber ich konnte auch nichts mit einem einfachen MySQL -Backend finden.

Ist das möglich? Gibt es irgendetwas, das eine Konnektivität zu einer anhaltenden Speicherung ermöglicht?

Vielen Dank!

UPDATE: Ich erinnere mich, dass der Autor dieses Thema in "Social Network Analysis for Startups" gesehen hat, und spricht über andere Speichermethoden (einschließlich HBASE, S3 usw.), zeigt jedoch nicht, wie dies zu tun ist oder ob es möglich ist.

War es hilfreich?

Lösung

Es gibt zwei allgemeine Arten von Containern zum Speichern von Grafiken:

  1. True Graph -Datenbanken: z.B, Neo4j, Agamemnon, GraphDB, und Allegrograph; Diese speichern nicht nur ein Diagramm, sondern verstehen auch, dass ein Diagramm ist. Zum Beispiel können Sie diese Datenbanken z. B. abfragen. Wie viele Knoten befinden sich zwischen dem kürzesten Pfad vom Knoten x und dem Knoten y?

  2. Statische Graphenbehälter: MySQL-angepasste FlockDB von Twitter ist hier das bekannteste Beispiel. Diese DBs können Grafiken gut speichern und abrufen. Um das Diagramm selbst abzufragen, müssen Sie zuerst das Diagramm von der DB abrufen und dann eine Bibliothek (z. B. Python's Excellent NetworkX) verwenden, um das Diagramm selbst abzufragen.

Der nachstehende Redis-basierte Graph Container, den ich unten diskutiere Redis-Graph, ein bemerkenswert kleines Python -Paket zur Implementierung einer Diagrammdatenbank in Redis.

Redis wird hier wunderschön funktionieren.

Redis ist ein hochkarätiger, langlebiger Datenspeicher, der für die Produktionsanwendung geeignet ist, ist aber auch einfach genug für die Befehlszeilenanalyse.

Redis unterscheidet sich von anderen Datenbanken darin, dass es mehrere Datenstrukturtypen aufweist. Der, den ich hier empfehlen würde, ist die Hash Datentyp. Mit dieser Redis -Datenstruktur können Sie eine "Liste der Wörterbücher" sehr genau nachahmen, ein herkömmliches Schema zum Speichern von Diagrammen, bei der jedes Element in der Liste ein Wörterbuch mit den an den Knoten geküssten Kanten ist, aus dem diese Kanten stammen.

Sie müssen zuerst installieren Redis und der Python -Kunde. Das Degizmo Blog hat ein ausgezeichnetes "aufstrebendes" Tutorial, das ein beinhaltet Schritt für Schritt GUID zur Installation beider.

Sobald Redis und sein Python -Client installiert sind, Starten Sie einen Redis -Server, was du so magst:

  • CD in das Verzeichnis, in dem Sie Redis installiert haben (/usr/local/bin auf 'nix, wenn du über installiert hast Installation machen); nächste

  • Typ Redis-Server An der Shell -Eingabeaufforderung eingeben und dann eingeben

Sie sollten jetzt die Serverprotokolldatei in Ihrem Shell -Fenster sehen

>>> import numpy as NP
>>> import networkx as NX

>>> # start a redis client & connect to the server:
>>> from redis import StrictRedis as redis
>>> r1 = redis(db=1, host="localhost", port=6379)

Im Snippet unten habe ich ein Vier-Knoten-Diagramm gespeichert. Jede Zeile unten ruft auf HMSET Auf dem Redis -Client und speichert einen Knoten und die mit diesem Knoten verbundenen Kanten ("0" => keine Kante, "1" => Kante). (In der Praxis würden Sie diese sich wiederholenden Anrufe in einer Funktion natürlich abstrakt; hier zeige ich jeden Anruf, weil es wahrscheinlich einfacher ist, diese Weise zu verstehen.)

>>> r1.hmset("n1", {"n1": 0, "n2": 1, "n3": 1, "n4": 1})
      True

>>> r1.hmset("n2", {"n1": 1, "n2": 0, "n3": 0, "n4": 1})
      True

>>> r1.hmset("n3", {"n1": 1, "n2": 0, "n3": 0, "n4": 1})
      True

>>> r1.hmset("n4", {"n1": 0, "n2": 1, "n3": 1, "n4": 1})
      True

>>> # retrieve the edges for a given node:
>>> r1.hgetall("n2")
      {'n1': '1', 'n2': '0', 'n3': '0', 'n4': '1'}

Jetzt, da die Grafik bestehen bleibt, holen Sie sie von der Redis DB als NetworkX -Diagramm ab.

Es gibt viele Möglichkeiten, dies zu tun. Im Folgenden hat es in die zwei *Schritte*:

  1. Extrahieren Sie die Daten aus der Redis -Datenbank in eine Adjazenzmatrix, implementiert als 2D -Numpy -Array; dann

  2. Konvertieren Sie das direkt in ein NetworkX -Diagramm mit einem NetworkXeingebaut Funktion:

Auf Code reduziert, sind diese beiden Schritte:

>>> AM = NP.array([map(int, r1.hgetall(node).values()) for node in r1.keys("*")])
>>> # now convert this adjacency matrix back to a networkx graph:
>>> G = NX.from_numpy_matrix(am)

>>> # verify that G in fact holds the original graph:
>>> type(G)
      <class 'networkx.classes.graph.Graph'>
>>> G.nodes()
      [0, 1, 2, 3]
>>> G.edges()
      [(0, 1), (0, 2), (0, 3), (1, 3), (2, 3), (3, 3)]

Wenn Sie eine Redis -Sitzung beenden, können Sie den Server vom Client wie SO herunterschalten:

>>> r1.shutdown()

Redis spart auf der Festplatte kurz bevor es heruntergefahren wird, also ist dies ein guter Weg, um sicherzustellen, dass alle Schreibvorgänge bestehen.

Wo ist der Redis DB? Es wird im Standardort mit dem Standarddateinamen gespeichert, nämlich DUPP.RDB Auf Ihrem Heimverzeichnis.

Um dies zu ändern, bearbeiten Sie die redis.conf Datei (mit der Redis -Quellverteilung enthalten); Gehen Sie in die Linie, beginnend mit:

# The filename where to dump the DB
dbfilename dump.rdb

Wechseln Sie Dump.rdb in alles, was Sie wünschen, aber lassen Sie die .rdb -Erweiterung an Ort und Stelle.

Um den Dateipfad zu ändern, finden Sie diese Zeile in redis.conf:

# Note that you must specify a directory here, not a file name

Die unten stehende Zeile ist der Verzeichnisort für die Redis -Datenbank. Bearbeiten Sie es so, dass es den gewünschten Ort rezitiert. Speichern Sie Ihre Überarbeitungen und benennen Sie diese Datei um, behalten Sie die .Conf -Erweiterung jedoch. Sie können diese Konfigurationsdatei überall dort speichern, wo Sie möchten, einfach den vollständigen Pfad und den Namen dieser benutzerdefinierten Konfigurationsdatei in derselben Zeile, wenn Sie einen Redis -Server starten:

Wenn Sie also das nächste Mal einen Redis -Server starten, müssen Sie es so tun (aus der Shell -Eingabeaufforderung:

$> cd /usr/local/bin    # or the directory in which you installed redis 

$> redis-server /path/to/redis.conf

Endlich, das Python -Paketindex Listet ein Paket speziell für die Implementierung einer Diagrammdatenbank in Redis auf. Das Paket heißt Redis-Graph Und ich habe es nicht benutzt.

Andere Tipps

Es gibt eine SQLLite3 -Backed NetworkX -Implementierung namens CloudLight.https://www.assembla.com/spaces/cloudlight/wiki/tutorial

Ich würde mich interessieren, um die beste Art zu sehen, die Festplatte zu nutzen. In der Vergangenheit habe ich mehrere Grafiken erstellt und sie als .dot -Dateien gespeichert. Dann mischte einige von ihnen irgendwie in Erinnerung. Nicht die beste Lösung.

from random import random
import networkx as nx

def make_graph():
    G=nx.DiGraph()
    N=10
    #make a random graph
    for i in range(N):
        for j in range(i):
            if 4*random()<1:
                G.add_edge(i,j)

    nx.write_dot(G,"savedgraph.dot")
    return G

try:
    G=nx.read_dot("savedgraph.dot")
except:
    G=make_graph() #This will fail if you don't use the same seed but have created the graph in the past. You could use the Singleton design pattern here.
print G.adj
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top