Für Testzwecke zu schaffen, ich bin einen Windows 7-Laptop mit den folgenden Spezifikationen verwendet: Neo4j 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.
Dies ist, was die Gesundheit Monitor zeigt mir:
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.
Können Sie den Python-Code teilen? –
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. –
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? –