2016-06-29 24 views
1

Für Testzwecke zu schaffen, ich bin einen Windows 7-Laptop mit den folgenden Spezifikationen verwendet: enter image description hereNeo4j Server werden sehr langsam, wenn Knoten und Beziehungen

ich auch Neo4j-Enterprise-3.0.2 und verbinden meinen PyCharm Python verwenden über die BOLT-Verbindung in die Datenbank programmieren. Ich erstelle viele Knoten und Beziehungen. Mir ist aufgefallen, dass die Erstellung von Knoten und Relationen nach einer gewissen Zeit enorm verlangsamt und nach einem bestimmten Punkt fast nicht mehr fortschreitet.

Ich habe folgende

  • I eindeutige Einschränkungen auf Knoten und Eigenschaften verwenden, so dass schema-Indizierung ist leicht zugänglich Knoten
  • ich in der Datenbank finden bemerkt, dass mein RAM-Speicher, während all dieser Erhöhung hält Transaktionen stattfinden. Ich habe verschiedene Einstellungen in der Datei neo4j config für dbms.memory.pagecache.size (default, 2g, 3g, 10g) verwendet und sie alle bewirken, dass mein RAM von etwa 4 GB (kein Python-Code läuft) auf bis zu 7 GB und mehr steigt. Dann wird die Erstellung von Knoten sehr langsam. Wenn Sie das Programm stoppen, fällt die RAM-Nutzung wieder ab.

enter image description here

Dies ist, was die Gesundheit Monitor zeigt mir:

enter image description here

Frage: Warum wird die Schaffung von Knoten und Beziehungen nach unten, so viel verlangsamt? Liegt es an der Größe des Graphen (aber der Datensatz scheint dafür eher klein zu sein)? Handelt es sich um die BOLT-Verbindungen und Transaktionen mit der Datenbank? Ist es mit der erhöhten RAM-Nutzung verbunden? Wie kann dies verhindert werden?

habe ich dieses einfaches Beispiel, das Problem zu zeigen:

from neo4j.v1 import GraphDatabase 

#BOLT driver 
driver = GraphDatabase.driver("bolt://localhost") 
session = driver.session() 

#start with empty database 
stmtDel = "MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n,r" 
session.run(stmtDel) 

#Add uniqueness constraint 
stmt = 'CREATE CONSTRAINT ON (d:Day) ASSERT d.name IS UNIQUE' 
session.run(stmt) 

# Create many nodes - run either option 1 or option 2 
# # Option 1: Creates a node one by one. This is slow in execution and keeps the RAM flat (no increase) 
# for i in range(1,80001): 
#  stmt1 = 'CREATE (d:Day) SET d.name = {name}' 
#  dict = {"name": str(i)} 
#  print(i) 
#  session.run(stmt1,dict) 

#Option 2: Increase the speed and submit multiple transactions at the same time - e.g.1000 
# This is very fast but blows up the RAM memory in no time, even with a limit on the page cache of 2GB 
tx = session.begin_transaction() 
for i in range(1, 80001): 
    stmt1 = 'CREATE (d:Day) SET d.name = {name}' 
    dict = {"name": str(i)} 
    tx.run(stmt1, dict) # append a transaction to the block 
    print(i) 
    if divmod(i,1000)[1] == 0: #every one thousand transactions submit the block and creat an new transaction block 
     tx.commit() 
     tx.close 
     tx = session.begin_transaction() #it seems that recycling the session keeps on growing the RAM. 
+0

Können Sie den Python-Code teilen? –

+0

William, ich fügte ein einfaches Beispiel in die Frage ein. Das zeigt, was das Problem verursacht. Es ist Transaktionsbezogen, glaube ich. Ich muss da etwas falsch machen. –

+0

Btw. auf deiner Einstellung sollte ein Seiten-Cache von 250M oder maximal 1G gut genug sein. Es scheint etwas über das tx/session mgmt des Python-Treibers zu sein. Welche Version verwendest du? –

Antwort

0

Was ich habe zuerst: ich tatsächlich zurück in das py2neo Paket für die Bulk-Transaktionsverarbeitung umgeschaltet und das hat gut funktioniert ohne mein Gedächtnis zu überlasten. Ich glaube, dass es ein Problem mit dem Paket und der Speicherverwaltung von neo4j.v1 geben muss.

Später: Ich habe eine neuere Version des Pakets neo4j verwendet, und das hatte das Problem nicht mehr. Es muss ein Bug in der früheren Version gewesen sein.