2015-03-03 9 views
5

हटाए जाने के बाद बहुत धीमी है Neo4j 1.9.9 का उपयोग करना। कुछ साइफर प्रश्न जो हम चल रहे थे, वे अनुचित रूप से धीमे लगते थे। कुछ जांच से पता चला कि:नियो 4j 1.9.9 लीगेसी इंडेक्स

  • हटाएँ 200k नोड्स मेरी हार्डवेयर (मैकबुक प्रो) पर लगभग 2-3 सेकंड लेता है, जब मैं उन्हें का उपयोग कर का चयन करें:

    START n=node(*) DELETE n 
    
  • एक कहां खंड काफी नहीं है जोड़ा जा रहा है इसे धीमा करें

  • यदि नोड्स को इंडेक्स का उपयोग करके चुना गया था, तो इसका प्रदर्शन समान है, उदाहरण के लिए

    START n=node:__types__(className="com.e2sd.domain.Comment") DELETE n 
    
  • छोड़कर कि जब पिछले परीक्षण दोहरा, यह 20x या अधिक वास्तविक समय 80 से कई सौ सेकंड के लिए अलग-अलग, धीमी है। इससे भी ज्यादा उत्सुकता, इससे कोई फर्क नहीं पड़ता कि मैं एक ही जेवीएम में परीक्षण दोहराता हूं या एक नया प्रोग्राम शुरू करता हूं, या डेटाबेस में सभी नोड्स को साफ़ करता हूं और सत्यापित करता हूं कि इसमें शून्य नोड्स हैं। सूचकांक आधारित हटाने जब तक परीक्षण के बाद में किसी भी चलाने पर बेहद धीमी गति से है मैं

    rm -R target/neo4j-test/ 
    

के साथ मेरी neo4j डेटा निर्देशिका पीटना मैं कुछ उदाहरण स्काला कोड यहाँ दे देंगे। मुझे आवश्यकतानुसार अधिक जानकारी प्रदान करने में प्रसन्नता हो रही है।

for (j <- 1 to 3) { 
    log("Total nodes in database: " + inNeo4j(""" START n=node(*) RETURN COUNT(n) """).to(classOf[Int]).single) 
    log("Start") 
    inNeo4j(""" CREATE (x) WITH x FOREACH(i IN RANGE(1, 200000, 1) : CREATE ({__type__: "com.e2sd.domain.Comment"})) """) 
    rebuildTypesIndex() 
    log("Created lots of nodes") 
    val x = inNeo4j(
    """ 
    START n=node:__types__(className="com.e2sd.domain.Comment") 
    DELETE n 
    RETURN COUNT(n) 
    """).to(classOf[Int]).single 
    log("Deleted x nodes: " + x) 
} 

// log is a convenience method that prints a string and the time since the last log 
// inNeo4j is a convenience method to run a Cypher query 



def rebuildTypesIndex(): Unit = { 
    TransactionUtils.withTransaction(neo4jTemplate) { 
    log.info("Rebuilding __types__ index...") 
    val index = neo4jTemplate.getGraphDatabase.getIndex[Node]("__types__") 
    for (node <- GlobalGraphOperations.at(neo4jTemplate.getGraphDatabaseService).getAllNodes.asScala) { 
     index.remove(node) 
     if (node.hasProperty("__type__")) { 
     val typeProperty = node.getProperty("__type__") 
     index.add(node, "className", typeProperty) 
     } 
    } 
    log.info("Done") 
    } 
} 

हम निम्नलिखित स्प्रिंग डेटा कॉन्फ़िगरेशन के साथ एम्बेडेड नियो 4j का उपयोग कर रहे हैं।

<bean id="graphDbFactory" class="org.neo4j.graphdb.factory.GraphDatabaseFactory"/> 
<bean id="graphDatabaseService" scope="singleton" destroy-method="shutdown" 
    factory-bean="graphDbFactory" factory-method="newEmbeddedDatabase"> 
    <constructor-arg value="target/neo4j-test"/> 
</bean> 
<neo4j:config graphDatabaseService="graphDatabaseService" base-package="my.package.*"/> 

वर्णन की गई शर्तों के तहत DELETE क्वेरी धीमी क्यों है?

+0

मुझे लगता है कि आपको विरासत सूचकांक से प्रविष्टियों को विशेष रूप से हटाना होगा, यह सुनिश्चित नहीं है कि नोड को हटाना पर्याप्त है। इस प्रकार, जब आप इसे दूसरी बार चलाते हैं, तो आपके सूचकांक में 400k प्रविष्टियां होती हैं, भले ही उनमें से आधे हटाए गए नोड्स को इंगित करें। इस तरह आपका प्रोग्राम धीमा है क्योंकि बार-बार रन इंडेक्स के आकार का विस्तार करते हैं। –

+0

यह एक बहुत अच्छी परिकल्पना है --- यह मेरे लिए नहीं हुआ था कि नोड को हटाना चुपचाप इंडेक्स में फांसी संदर्भ छोड़ देगा, लेकिन दूसरे व्यवहार को समझ में आता है! –

+0

यदि आप कोई उत्तर दर्ज करते हैं, तो मैं इस परिकल्पना का परीक्षण करूंगा और सही होने पर बक्षीस का पुरस्कार दूंगा। हालांकि आपको जल्दी करना होगा, यह जल्द ही समाप्त हो जाएगा। –

उत्तर

2

आपको विरासत सूचकांक से विशेष रूप से प्रविष्टियों को हटाना होगा, नोड्स को हटाने से यह विरासत सूचकांक से निकालने के लिए पर्याप्त नहीं है। इस प्रकार, जब आप इसे दूसरी बार चलाते हैं, तो आपके सूचकांक में 400k प्रविष्टियां होती हैं, भले ही उनमें से आधे हटाए गए नोड्स को इंगित करें। इस तरह आपका प्रोग्राम धीमा है क्योंकि बार-बार रन इंडेक्स के आकार का विस्तार करते हैं।

मुझे यह समस्या थी जब मैंने आरटीआरआई को थोक लोड करने के लिए neo4j स्थानिक को विस्तार लिखा था। मुझे जावा एपीआई का उपयोग करना था जिसे आपको इंडेक्स से नोड को हटाने से अलग से हटा देना था। मैं खुशी से मदद कर सकता है।

+0

मैंने इंडेक्स में सभी नोड्स प्राप्त करने के लिए कुछ अन्य स्टैक ओवरफ्लो पृष्ठों में सुझाए गए index.query ("*: *") का उपयोग किया, फिर प्रत्येक को हटा दिया, फिर प्रत्येक नोड को इंडेक्स पर वापस टाइप करके जारी रखा। –

संबंधित मुद्दे