2011-06-02 86 views
4

我正在處理的項目將索引一定數量的數據(使用長文本),並將它們與每個間隔(約15到30分鐘)的單詞列表進行比較。太多打開的文件Lucene的錯誤

過了一段時間,說第35輪,同時開始索引新的數據集上的第36輪發生這樣的錯誤:

[ERROR] (2011-06-01 10:08:59,169) org.demo.service.LuceneService.countDocsInIndex(?:?) : Exception on countDocsInIndex: 
    java.io.FileNotFoundException: /usr/share/demo/index/tag/data/_z.tvd (Too many open files) 
     at java.io.RandomAccessFile.open(Native Method) 
     at java.io.RandomAccessFile.<init>(RandomAccessFile.java:233) 
     at org.apache.lucene.store.SimpleFSDirectory$SimpleFSIndexInput$Descriptor.<init>(SimpleFSDirectory.java:69) 
     at org.apache.lucene.store.SimpleFSDirectory$SimpleFSIndexInput.<init>(SimpleFSDirectory.java:90) 
     at org.apache.lucene.store.NIOFSDirectory$NIOFSIndexInput.<init>(NIOFSDirectory.java:91) 
     at org.apache.lucene.store.NIOFSDirectory.openInput(NIOFSDirectory.java:78) 
     at org.apache.lucene.index.TermVectorsReader.<init>(TermVectorsReader.java:81) 
     at org.apache.lucene.index.SegmentReader$CoreReaders.openDocStores(SegmentReader.java:299) 
     at org.apache.lucene.index.SegmentReader.get(SegmentReader.java:580) 
     at org.apache.lucene.index.SegmentReader.get(SegmentReader.java:556) 
     at org.apache.lucene.index.DirectoryReader.<init>(DirectoryReader.java:113) 
     at org.apache.lucene.index.ReadOnlyDirectoryReader.<init>(ReadOnlyDirectoryReader.java:29) 
     at org.apache.lucene.index.DirectoryReader$1.doBody(DirectoryReader.java:81) 
     at org.apache.lucene.index.SegmentInfos$FindSegmentsFile.run(SegmentInfos.java:736) 
     at org.apache.lucene.index.DirectoryReader.open(DirectoryReader.java:75) 
     at org.apache.lucene.index.IndexReader.open(IndexReader.java:428) 
     at org.apache.lucene.index.IndexReader.open(IndexReader.java:274) 
     at org.demo.service.LuceneService.countDocsInIndex(Unknown Source) 
     at org.demo.processing.worker.DataFilterWorker.indexTweets(Unknown Source) 
     at org.demo.processing.worker.DataFilterWorker.processTweets(Unknown Source) 
     at org.demo.processing.worker.DataFilterWorker.run(Unknown Source) 
     at java.lang.Thread.run(Thread.java:636) 

我已經嘗試過通過設置打開文件的最大數量:

 ulimit -n <number> 

但經過一段時間後,如果間隔大約有1050行長文本,則會發生相同的錯誤。但它只發生過一次。

我應該按照從(Too many open files) - SOLR修改Lucene IndexWriter的mergeFactor的建議嗎?或者這是一個索引數據量的問題?

我也讀過這是批量索引或交互式索引之間的選擇。 如何通過頻繁的更新來確定索引是否是交互式的? 我應該在交互式索引下分類這個項目嗎?

更新:我加入我的IndexWriter的片段:

 writer = new IndexWriter(dir, new StandardAnalyzer(Version.LUCENE_30), IndexWriter.MaxFieldLength.UNLIMITED); 

好像maxMerge(或字段長度...?)已被設置爲無限制。

回答

2

我已經使用了ulimit,但仍然顯示錯誤。 然後我檢查了用於lucene功能的定製核心適配器。 原來有太多的IndexWriter.open目錄是左開的。

應該注意,處理完畢後,總會調用關閉打開的目錄。

+0

嗨,我是Lucene新手。你的意思是調用'writer.close()'或'writer.getDirectory()。close()'? – 2011-09-20 12:01:11

+1

作家和作家的目錄都應該在使用後關閉。 有一些打開的目錄訪問我的,這就是爲什麼我有太多的打開文件錯誤。 =] – eunique0216 2011-09-21 03:44:32

+0

有趣的是,我已經完成了這裏的所有建議,並且我仍然以相同的錯誤結束。 – alvas 2013-01-15 08:51:38

1

您需要仔細檢查ulimit值是否已被實際保留並設置爲適當的值(無論最大值是多少)。

很可能您的應用沒有正確關閉索引讀寫器。我在Lucene郵件列表中看到過很多像這樣的故事,它幾乎總是用戶應用程序,而不是Lucene本身。

0

使用複合索引來減少文件數量。當這個標誌被設置時,lucene會將一個段寫成單個.cfs文件而不是多個文件。這將顯着減少文件數量。

IndexWriter.setUseCompoundFile(true) 
相關問題