मैं neo4j के लिए नौसिखिया हूँ। मैंने इस प्रश्न को यहां पोस्ट करने से पहले कुछ शोध किया है, लेकिन मेरे लिए काम करने वाला कोई समाधान नहीं मिला। मेरे पास 32GB रैम के साथ एक ubuntu VM है। मैं वर्तमान में neo4j-community संस्करण 4.0.2 का उपयोग कर रहा हूं और मेरी neo4j.conf फ़ाइल में कॉन्फ़िगरेशन के नीचे है।

dbms.memory.heap.initial_size=5120m
dbms.memory.heap.max_size=5120m
dbms.memory.pagecache.size=10g

मैं साइफर-शेल का उपयोग करके CSV फ़ाइलों को डिफ़ॉल्ट neo4j डेटाबेस में आयात करने का प्रयास कर रहा हूं। यह छोटी फ़ाइलों के लिए अच्छी तरह से काम करता है, लेकिन मुझे आकार> 1GB की csv फ़ाइलों में समस्या है। यह नीचे त्रुटि के साथ विफल रहता है

मेमोरी सीमा पार होने के कारण ५२४२८८ बाइट आवंटित नहीं किया जा सकता; प्रयुक्त=२१४७२६६५६०, अधिकतम=२१४७४८३६४८

मैंने जावा हीप स्पेस को बढ़ाने के लिए JAVA_OPTS=-Xmx4G सेट करने की कोशिश की, लेकिन यह अभी भी उसी त्रुटि के साथ विफल है। क्या कोई कृपया सहायता कर सकता है? क्या साइफर-शेल उपयोगिता अधिक ढेर स्थान की तलाश में है या क्या यह neo4j डेटाबेस अतिरिक्त ढेर स्थान की तलाश में है? यदि साइफर-शेल का उपयोग बड़ी फ़ाइलों को आयात करने के लिए नहीं किया जा सकता है, तो मेरे लिए बड़ी फ़ाइलों को आयात करने के लिए अन्य विकल्प क्या हैं?

संपादित करें: मैं प्रत्येक 200 पंक्तियों के लिए एक आवधिक प्रतिबद्धता का उपयोग कर रहा हूं और मेरे पास एक .cypher फ़ाइल में नीचे की साइबर स्क्रिप्ट है और .cypher फ़ाइल को चलाने के लिए cypher-shell का उपयोग कर रहा है

CREATE INDEX ON:Review (nr);

USING PERIODIC COMMIT 200 LOAD CSV WITH HEADERS FROM "file:///12Review.csv" AS row 
MERGE (R:Review {nr: toInteger(row.nr)}) 
WITH row, R
FOREACH(ignoreMe in CASE WHEN row.reviewDate IS NULL THEN [] ELSE [1] END| SET R.reviewDate =row.reviewDate)
FOREACH(ignoreMe in CASE WHEN row.title IS NULL THEN [] ELSE [1] END| SET R.title = row.title)
FOREACH(ignoreMe in CASE WHEN row.rating1 IS NULL THEN [] ELSE [1] END| SET R.rating1 =row.rating1) 
FOREACH(ignoreMe in CASE WHEN row.rating2 IS NULL THEN [] ELSE [1] END| SET R.rating2 =row.rating2) 
FOREACH(ignoreMe in CASE WHEN row.rating3 IS NULL THEN [] ELSE [1] END| SET R.rating3 =row.rating3) 
FOREACH(ignoreMe in CASE WHEN row.rating4 IS NULL THEN [] ELSE [1] END| SET R.rating4 =row.rating4)
0
achyuthgurram 23 मार्च 2020, 03:19

1 उत्तर

सबसे बढ़िया उत्तर

मैं इस पर एक EXPLAIN चला रहा हूं और क्वेरी प्लान में एक उत्सुक ऑपरेटर देख रहा हूं, जो मूल रूप से आवधिक प्रतिबद्धता को रद्द कर देता है और सभी परिणामों को स्मृति में प्रकट करने का कारण बनता है, जो ढेर ऑपरेशन से बाहर हो रहा है। यहां के FOREACHes इसका कारण बन रहे हैं, आप आवधिक प्रतिबद्धता का उपयोग करते समय इस दृष्टिकोण का उपयोग नहीं कर पाएंगे।

इसके बजाय पहले गैर-शून्य मान का उपयोग करने के लिए coalesce() का उपयोग करने का प्रयास करें, पहले पंक्ति मान प्राप्त करने का प्रयास करें, फिर नोड मान का उपयोग करें:

USING PERIODIC COMMIT 10000 LOAD CSV WITH HEADERS FROM "file:///12Review.csv" AS row 
MERGE (R:Review {nr: toInteger(row.nr)}) 
SET R.reviewDate = coalesce(row.reviewDate, R.reviewDate),
R.reviewDate = coalesce(row.title, R.title),
R.reviewDate = coalesce(row.rating1, R.rating1),
R.reviewDate = coalesce(row.rating2, R.rating2),
R.reviewDate = coalesce(row.rating3, R.rating3),
R.reviewDate = coalesce(row.rating4, R.rating4)
0
InverseFalcon 24 मार्च 2020, 00:52