2012-03-05 11 views
5

मैं अपने neo4j डेटाबेस में कुछ डेटा स्टोर करना चाहता हूं। मैं इसके लिए वसंत-डेटा-neo4j का उपयोग करें।CRUDRepository की विधि सहेजना बहुत धीमा है?

मेरे कोड का पालन की तरह है:

for (int i = 0; i < newRisks.size(); i++) { 
     myRepository.save(newRisks.get(i)); 
     System.out.println("saved " + newRisks.get(i).name); 
    } 

मेरे newRisks सरणी 60000 वस्तुओं और 60000 किनारों के लगभग होता है। प्रत्येक नोड और किनारे में एक संपत्ति होती है। इस लूप की अवधि लगभग 15-20 मिनट है, क्या यह सामान्य है? मैंने कुछ बाधाओं को खोजने के लिए जावा विजुअलVM का उपयोग किया, लेकिन मेरा औसत सीपीयू उपयोग 10 - 25% (4 कोर का) था और मेरा ढेर आधे से भी कम था।

इस ऑपरेशन को बढ़ाने के लिए कोई विकल्प हैं?


संपादित करें: अतिरिक्त है, myRepository.save(newRisks.get(i)); के पहले फोन पर पहले उत्पादन से पहले कुछ मिनट fpr JVM गिरने assleep आ रहा है

दूसरा संपादित करें:

कक्षा जोखिम:

@NodeEntity 
public class Risk { 
    //... 
    @Indexed 
    public String name; 

    @RelatedTo(type = "CHILD", direction = Direction.OUTGOING) 
    Set<Risk> risk = new HashSet<Risk>(); 

    public void addChild(Risk child) { 
     risk.add(child); 
    } 

    //... 
} 

जोखिम बनाना:

@Autowired 
private Repository myRepository; 

@Transactional 
public Collection<Risk> makeSomeRisks() { 

    ArrayList<Risk> newRisks = new ArrayList<Risk>(); 

    newRisks.add(new Risk("Root")); 

    for (int i = 0; i < 60000; i++) { 
     Risk risk = new Risk("risk " + (i + 1)); 
     newRisks.get(0).addChild(risk); 
     newRisks.add(risk); 
    } 

    for (int i = 0; i < newRisks.size(); i++) { 
     myRepository.save(newRisks.get(i)); 
    } 

    return newRisks; 
} 
+0

[दस्तावेज़ीकरण] के अनुसार (http://static.springsource.org/spring-data/data-neo4j/docs/2.0.0.RC1/api/org/springframework/data/neo4j/repository/CRUDRepository। एचटीएमएल), CRUDRepository.save एक तर्क के रूप में एक Iterable ले सकते हैं। क्यों न सिर्फ myRepository.save (newRisks)? – Thomas

+0

मैंने कोशिश की और यह भी काम करता है। लेकिन, यह तेज़ नहीं है। इसलिए मैं देख सकता हूं, वह मर नहीं गया है ^^ – hilbert

+0

क्या आप अपनी कक्षा की संरचना और किसी भी नोड-संस्थाओं और संबंध-संस्थाओं को दिखा सकते हैं जो इसका संदर्भ है। और आपके जोखिम के उदाहरणों के निर्माण की विधि? –

उत्तर

5

समस्या यहाँ है कि आप एक एपीआई कि उस के लिए इरादा नहीं है के साथ बड़े पैमाने पर आवेषण कर रहे हैं।

आप एक जोखिम और 60k बच्चों बनाने के लिए, आप पहली बार जड़ जो भी एक ही समय में 60k बच्चों बनी रहती है (और रिश्तों बनाता है) को बचाने के। यही कारण है कि पहली बचत इतनी लंबी लगती है। और फिर आप बच्चों को फिर से बचाओ।

कुछ समाधान यह तेजी लाने के लिए एसडीएन साथ कर रहे हैं।

  1. जन आवेषण के लिए संग्रह दृष्टिकोण का उपयोग नहीं करते हैं, (, जड़, बच्चे, "बच्चा" गलत) दोनों प्रतिभागियों जारी रहती है और प्रयोग template.createRelationshipBetween;

  2. बच्चों पहला तो जड़ वस्तु के लिए सभी मौजूदा बच्चों जोड़ने जारी रहती है और जारी रहती है कि

  3. तुमने किया था के रूप में, Neo4j कोर एपीआई का उपयोग लेकिन template.postEntityCreation (नोड, Risk.class) कहते हैं तो आप एसडीएन के माध्यम से संस्थाओं तक पहुंच सकें।फिर आपको अपनी खुद की इकाइयों को भी इंडेक्स करना होगा (db.index.forNodes ("जोखिम")। जोड़ें (नोड, "नाम", नाम);) (या neo4j कोर-एपीआई ऑटो-इंडेक्स का उपयोग करें, लेकिन यह नहीं है एसडीएन के साथ संगत)।

  4. कोर-api या SDN आप सर्वश्रेष्ठ प्रदर्शन के लिए चारों ओर 10-20k नोड्स/rels की tx-आकार का उपयोग करना चाहिए

+0

धन्यवाद आप सही हैं। पहले मैं बस रूट को बचाता हूं, इसमें केवल 6 मिनट लगते हैं। शायद बाद में मुझे आपके द्वारा प्रस्तावित अन्य समाधानों का प्रयास करना होगा। – hilbert

1

अपने डेटाबेस (जावा के बाहर) में सम्मिलित करना एक ही देरी है या क्या यह केवल वसंत डेटा के माध्यम से एक समस्या है?

+0

अच्छे विचार में "द्वितीय संस्करण:" के तहत सूचनाएं जोड़ दीं, लेकिन मैं जावा से नोट्स की इस गिनती आदि को कैसे सम्मिलित कर सकता हूं? मैं एक अन्य प्रोग्रामिंग भाषा नहीं लेना चाहता हूं। एक अन्य विचार: मैं मानक neo4j जावा api, वसंत-डेटा-neo4j नहीं उपयोग करने का प्रयास कर सकते हैं। – hilbert

+0

बस अपने एसक्यूएल संपादक में एक सम्मिलन कथन को आग लगाएं। यह किसी भी प्रोग्रामिंग भाषा के बाहर डेटाबेस की गति का परीक्षण करेगा। – abehrens

+0

इसकी एक NoSQL डेटाबेस है, लेकिन मैं इसे natic जावा एपीआई के साथ neo4j के लिए कोशिश की है, तेजी से – hilbert

5

मुझे लगता है कि मैं एक समाधान मिल गया है:

मैं nativ neo4j जावा एपीआई का उपयोग कर एक ही डालने की कोशिश की:

GraphDatabaseService graphDb; 
Node firstNode; 
Node secondNode; 
Relationship relationship; 

graphDb = new EmbeddedGraphDatabase(DB_PATH); 
Transaction tx = graphDb.beginTx(); 

try { 
    firstNode = graphDb.createNode(); 
    firstNode.setProperty("name", "Root"); 

    for (int i = 0; i < 60000; i++) { 
     secondNode = graphDb.createNode(); 
     secondNode.setProperty("name", "risk " + (i+1)); 

     relationship = firstNode.createRelationshipTo(secondNode, RelTypes.CHILD); 
    } 
    tx.success(); 
} 
finally { 
    tx.finish(); 
    graphDb.shutdown(); 
} 

परिणाम: कुछ sconds के बाद, डेटाबेस जोखिम से भरा है ।

शायद प्रतिबिंब इस दिनचर्या को वसंत-डेटा-नियो 4j के साथ धीमा कर दें। @ माइकल हंगर ने अपनी पुस्तक GoodRelationships में कुछ ऐसा कहा, उस टिप के लिए धन्यवाद।

+0

यह मेरा दिन बचाया thats! बहुत सराहना की, धन्यवाद। – jarandaf

1

साथ भले ही मैं ओ पी के रूप में एक ही समस्या का सामना करना पड़ा। वास्तव में मेरे मामले में उपयोगी एम्बेडेड दूरस्थ सर्वर को मोड से Neo4j उपयोग बदलने के लिए किया गया था। एम्बेडेड एसडीएन उपयोग का अच्छा उदाहरण here पाया जा सकता है।

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