2010-07-21 6 views
7

मैंने एक छोटा लूप लिखा जिसने इंडेक्सवाइटर में 10,000 दस्तावेज़ जोड़े और इसे हमेशा करने के लिए लिया।ल्यूसीन इंडेक्सवाइटर दस्तावेज जोड़ने में धीमा

क्या बड़ी मात्रा में दस्तावेज़ों को सूचीबद्ध करने का कोई और तरीका है?

मैं पूछता हूं क्योंकि जब यह लाइव हो जाता है तो उसे 15,000 रिकॉर्ड लोड करना पड़ता है।

दूसरा सवाल यह है कि जब वेब एप्लिकेशन पुनरारंभ होता है तो मैं फिर से सभी रिकॉर्ड्स में लोड होने से कैसे रोक सकता हूं?

संपादित

यहाँ कोड मैं प्रयोग किया जाता है,

for (int t = 0; t < 10000; t++){ 
    doc = new Document(); 
    text = "Value" + t.toString(); 
    doc.Add(new Field("Value", text, Field.Store.YES, Field.Index.TOKENIZED)); 
    iwriter.AddDocument(doc); 
}; 

संपादित 2

 Analyzer analyzer = new StandardAnalyzer(); 
     Directory directory = new RAMDirectory(); 

     IndexWriter iwriter = new IndexWriter(directory, analyzer, true); 

     iwriter.SetMaxFieldLength(25000); 

तो कोड दस्तावेजों को जोड़ने के लिए है, तो;

 iwriter.Close(); 
+1

हमेशा के लिए कितना समय था? –

+0

में लगभग 2.5 से 3 मिनट लग गए। क्या इसकी उम्मीद की जानी चाहिए थी? – griegs

+0

मुझे यह जोड़ना चाहिए कि दस्तावेज़ों में एक फ़ील्ड था और फ़ील्ड के मान के रूप में "मान" + t.toString() था। बहुत छोटा – griegs

उत्तर

5

बस जांच कर रहा है, लेकिन जब आप इसे चला रहे हैं तो आपको डिबगर संलग्न नहीं मिला है?

यह दस्तावेज़ जोड़ते समय प्रदर्शन को गंभीर रूप से प्रभावित करता है।

मेरी मशीन पर (Lucene 2.0.0.4):

मंच लक्ष्य 86 के साथ बनाया गया:

  • नहीं डिबगर - 5.2 सेकंड

  • डीबगर संलग्न - 113.8 सेकंड

प्लेटफ़ॉर्म लक्ष्य x64:

के साथ बनाया गया
  • नहीं डिबगर - 6.0 सेकंड

  • डीबगर संलग्न - 171.4 सेकंड

बचत और करने के लिए और एक RAMDirectory से एक सूचकांक को लोड करने की रफ उदाहरण:

const int DocumentCount = 10 * 1000; 
const string IndexFilePath = @"X:\Temp\tmp.idx"; 

Analyzer analyzer = new StandardAnalyzer(); 
Directory ramDirectory = new RAMDirectory(); 

IndexWriter indexWriter = new IndexWriter(ramDirectory, analyzer, true); 

for (int i = 0; i < DocumentCount; i++) 
{ 
    Document doc = new Document(); 
    string text = "Value" + i; 
    doc.Add(new Field("Value", text, Field.Store.YES, Field.Index.TOKENIZED)); 
    indexWriter.AddDocument(doc); 
} 

indexWriter.Close(); 

//Save index 
FSDirectory fileDirectory = FSDirectory.GetDirectory(IndexFilePath, true); 
IndexWriter fileIndexWriter = new IndexWriter(fileDirectory, analyzer, true); 
fileIndexWriter.AddIndexes(new[] { ramDirectory }); 
fileIndexWriter.Close(); 

//Load index 
FSDirectory newFileDirectory = FSDirectory.GetDirectory(IndexFilePath, false); 
Directory newRamDirectory = new RAMDirectory(); 
IndexWriter newIndexWriter = new IndexWriter(newRamDirectory, analyzer, true); 
newIndexWriter.AddIndexes(new[] { newFileDirectory }); 

Console.WriteLine("New index writer document count:{0}.", newIndexWriter.DocCount()); 
+0

+1, इसके लिए धन्यवाद, मैं आज रात देखता हूं। मुझे संदेह है कि अब यह डीबगर हो सकता है कि आप इसका जिक्र करते हैं। आपकी मदद के लिए धन्यवाद – griegs

+0

आपकी मदद के लिए धन्यवाद। मैं आपको बहुत अच्छे समय नहीं मिल रहा हूं। मेरा 16secs पर है जो मुझे लगता है स्वीकार्य है। मुझे लगता है कि यह अब मेरे हार्डवेअर पर है। – griegs

10

आप सर्वश्रेष्ठ प्रदर्शन प्राप्त करने के लिए इस तरह से करना चाहिए।मेरी मशीन पर मैं अनुक्रमण 1000 दस्तावेज़ में 1 सेकंड

1) आप पुनः उपयोग करना चाहिए (दस्तावेज़, फील्ड) हर बार बनाने नहीं क्या आप सूत्रण इस्तेमाल कर सकते हैं कि और इसके बाद

private static void IndexingThread(object contextObj) 
{ 
    Range<int> range = (Range<int>)contextObj; 
    Document newDoc = new Document(); 
    newDoc.Add(new Field("title", "", Field.Store.NO, Field.Index.ANALYZED)); 
    newDoc.Add(new Field("body", "", Field.Store.NO, Field.Index.ANALYZED)); 
    newDoc.Add(new Field("newsdate", "", Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS)); 
    newDoc.Add(new Field("id", "", Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS)); 

    for (int counter = range.Start; counter <= range.End; counter++) 
    { 
     newDoc.GetField("title").SetValue(Entities[counter].Title); 
     newDoc.GetField("body").SetValue(Entities[counter].Body); 
     newDoc.GetField("newsdate").SetValue(Entities[counter].NewsDate); 
     newDoc.GetField("id").SetValue(Entities[counter].ID.ToString()); 

     writer.AddDocument(newDoc); 
    } 
} 

की तरह एक दस्तावेज़ जुड़ कर रहा हूँ छोटे में अपने विशाल संग्रह को तोड़ने, और यदि आप 10,000 दस्तावेज है, उदाहरण के लिए प्रत्येक अनुभाग के लिए ऊपर दिए गए कोड का उपयोग आप 10 थ्रेड ThreadPool का उपयोग कर बना सकते हैं और अनुक्रमण

के लिए एक थ्रेड के लिए प्रत्येक अनुभाग फ़ीड तो फिर तुम मिलेगा सबसे अच्छा प्रदर्शन।

+0

+1 @ एहसान, इसके लिए धन्यवाद। मैं आज कोशिश करूँगा। – griegs

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