2017-02-28 1 views
1

Ich war mit neo4j 3.1.0 Enterprise Edition. Das Hauptlogik in meinem Diagramm ist: Es gibt "IP" Knoten und "Benutzer" Knoten und beide haben "UNIQUE" Einschränkungen. Bei jeder Benutzeranmeldung füge ich eine Beziehung von IP zu Benutzer hinzu.Neo4j wird ziemlich langsam mit hoher Transaktion Nebenläufigkeit

Hier ist mein Einsatz Cypher:

MERGE (i:IP {ip:"1.2.3.4"}) 
MERGE (u:User {username:"[email protected]"}) 
MERGE (i) - [l:SUCC] -> (u) 
SET i:ExpireNode, i.expire={expire} 
SET u:ExpireNode, u.expire={expire} 
SET l.expire={expire}, l.login={login} 

Der Einsatz ist ziemlich schnell, wie am Anfang. Wenn die Anzahl der Knoten jedoch auf Millionen ansteigt, wurde sie sehr langsam und dauerte manchmal mehr als 1 Sekunde, um Knoten und Beziehungen einzufügen.

Wie könnte ich es optimieren? Ich habe neo4j mit 12-Core-CPU und 64G-Speicher ausgeführt. Die anfängliche Kopfgröße beträgt 16G und der Seitencache beträgt 30G.

---------------------------------------------- ----------------

Getestet die gleiche Chiffre in Web-UI und es dauerte 10ms für Befehle. Aber mit dem Java-Treiber dauert es manchmal mehr als 1s. Unten ist mein Java-Code:

try (Transaction tx = session.beginTransaction()) { 
    for (Login login : loginList) { 
     Value value = login2Operation(login); 
     tx.run(INSERT_COMMANDS_SUCC, value); 
    } 
    tx.success(); 
} 

------------------------------------- -------------------------

Nach einigem Erkunden stellte ich fest, dass die Insert-Geschwindigkeit signifikant anstieg, wenn sie in 5 Threads lief. Aber die Gesamtgeschwindigkeit ist zu langsam und ich muss auf 100 Threads erhöhen. Dann wächst die einzelne Einfügung jeder Geschwindigkeit auf 1s. Also, ich glaube, das Problem ist, weil die parallele Fähigkeit von Neo4j. In der neo4j.conf fügte ich dbms.threads.worker_count=200 hinzu. Aber es hilft nicht. Irgendwelche Ideen?

+1

Können Sie einen Lauf dieser Abfrage Profil und in den Ergebnissen einfügen (nach allen Elementen des Profils erweitert)? – InverseFalcon

+0

@InverseFalcon Guter Punkt! Ich habe den Befehl in Neo4j Web UI versucht, und es dauert nur 10ms. Es scheint jedoch mehr als 1s bei der Verwendung von neo4j-java-Treiber benötigt. Ich schätze das Problem ist, weil der Java-Treiber? Den Java-Code für weitere Informationen hinzugefügt. –

+1

Vielleicht möchten Sie [Michael Hunger Tipps und Tricks] (http://jexp.de/blog/2017/03/5-tips-tricks-for-fast-batched-updates-of) überprüfen -graph-structures-with-neo4j-und-cypher/# _ unwind_to_the_rescue) für Batches und Insertionen. Anstatt Ihre Operationen in einer for-Schleife auszuführen, sollten Sie wahrscheinlich alle relevanten Parameter in einer Liste sammeln, dann einen einzigen Aufruf ausführen und in Ihrem Lauf die Sammlung aufheben und Ihre Änderungen auf einmal anwenden. – InverseFalcon

Antwort

Verwandte Themen