2016-06-20 3 views
0

Ich habe einen ziemlich großen Datensatz, ~ 68 Millionen Datenpunkte. Die Daten sind derzeit in MongoDB gespeichert und ich habe ein Java-Programm geschrieben, das die Daten durchläuft, um Datenpunkte miteinander zu verbinden und sie mithilfe von Cypher-Befehlen in der Neo4j-Datenbank zu speichern. Ich habe dieses Programm mit einem Testsatz von Daten (~ 1,5 Millionen) ausgeführt und es funktionierte, lief es über Nacht. Wenn ich jetzt versuche, den gesamten Datensatz zu importieren, ist das Programm extrem langsam. Lief das ganze Wochenende und nur ~ 350.000 Datenpunkte haben es geschafft. Durch einige kurze Tests scheint Neo4j der Flaschenhals zu sein. Es ist eine halbe Stunde her, seit ich das Java-Programm gestoppt habe, aber die CPU-Auslastung von Neo4j liegt bei 100% und neue Knoten werden noch hinzugefügt (aus dem Java-Programm). Gibt es diesen Engpass überhaupt zu überwinden? Ich habe über Multithreading nachgedacht, aber seit ich versuche, ein Netzwerk zu erstellen, gibt es viele Abhängigkeiten und nicht threadsichere Operationen. Danke für Ihre Hilfe!Importieren von massiven Datensatz zu Neo4j ist extrem langsam

EDIT: Die Daten, die ich habe, ist eine Liste von Benutzern. Die enthaltenen Daten sind die Benutzer-ID und ein Array mit den IDs der Freunde des Benutzers. Meine Cypher Anfragen schauen ein wenig wie folgt aus: "u:USER {id:" + currentID + "}) CREATE (u)-[:FRIENDS {ts:" + timeStamp}]->(u" + connectionID + ":USER {id:" + connectionID + "})" Sorry, wenn dies wirklich schrecklich, ziemlich neu in diesem

+0

können Sie einige der Beispielabfragen teilen. Wenn Sie MERGE oder MATCH verwenden, achten Sie darauf, Indizes oder bessere Einschränkungen für diese Label + -Eigenschaftskombinationen zu haben. –

+0

Ich denke, wenn Sie Java verwenden, sollten Sie Java Neo4j API verwenden, das ist viel schneller. Die Chiffre Abfrage muss übersetzt werden. – Mvde

Antwort

1

sollten Sie zuerst auf aussehen:

neo4j import slowing down

Wenn Sie noch zu DIY entscheiden, Es gibt ein paar Dinge, auf die Sie achten sollten: Stellen Sie sicher, dass Sie nicht versuchen, alle Ihre Daten in einer Transaktion zu importieren. Andernfalls wird der Code die meiste Zeit vom Garbage Collector ausgesetzt. Zweitens, stellen Sie sicher, dass Sie dem Neo4j-Prozess (oder Ihrer Anwendung, wenn Sie eine eingebettete Instanz von Neo4j verwenden) viel Speicher zur Verfügung gestellt haben. 68 Millionen Knoten sind für Neo4j trivial, aber wenn der Cypher, den du erzeugst, ständig Dinge wie z. Erstellen Sie neue Beziehungen, dann treten schwerwiegende Paging-Probleme auf, wenn Sie nicht genügend Arbeitsspeicher reservieren. Schließlich, wenn Sie Knoten, die durch Eigenschaften suchen nach oben (und nicht von id), dann sollten Sie mit Etiketten und Schema-Indizes sein:

http://neo4j.com/news/labels-and-schema-indexes-in-neo4j/

1

Haben konfigurieren Sie neo4j.properties und Neo4j-wrapper.conf Dateien? Es wird dringend empfohlen, die Werte entsprechend der verfügbaren RAM-Menge anzupassen.

in conf/Neo4j-wrapper.conf ich in der Regel für einen 12GB RAM-Server verwenden

wrapper.java.initmemory=8000 
wrapper.java.maxmemory=8000 

in conf/neo4j.properties stelle ich

dbms.pagecache.memory=8000 

http://neo4j.com/blog/import-10m-stack-overflow-questions/ für ein komplettes Beispiel Siehe zu importieren 10M Knoten in wenigen Minuten, es ist ein guter Ausgangspunkt

SSD werden auch empfohlen, um den Import zu beschleunigen.

0

Eine Sache, die ich beim Laden von Massendaten in eine Datenbank gelernt habe, war das vorübergehende Ausschalten der Indizierung auf den Zieltabelle (n). Andernfalls verursachte jeder neue hinzugefügte Datensatz eine separate Aktualisierung der Indizes, was dazu führte, dass Los der Arbeit auf der Festplatte. Es war viel schneller, die gesamte Tabelle in einem separaten Vorgang neu zu indizieren, nachdem das Laden der Daten abgeschlossen war. YMMV.