我正在处理的项目是将一定数量的数据(长文本)编入索引,并将其与每个间隔的文本列表(大约15到30分钟)进行比较。
经过一段时间后,说出第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行的长文本时,发生相同的错误。 但它只发生过一次。
我应该按照从(太多打开的文件)修改Lucene IndexWriter的mergeFactor的build议- SOLR或这是一个问题的数据量被索引?
我也读过这是批量索引或交互式索引之间的select。 如何通过频繁更新来确定索引是否互动? 我应该在交互式索引下对这个项目进行分类吗?
更新:我添加我的IndexWriter的片段:
writer = new IndexWriter(dir, new StandardAnalyzer(Version.LUCENE_30), IndexWriter.MaxFieldLength.UNLIMITED);
看起来像maxMerge(?或字段长度…)已经设置为无限。
我已经使用了ulimit,但仍然显示错误。 然后我检查了定制的核心适配器的lucene功能。 原来有太多的IndexWriter.open目录是左开的。
应该注意的是,处理完毕后,总是会打开关闭的目录。
你需要仔细检查ulimit
值是否已经被保持,并设置为一个合适的值(不管最大值是多少)。
很可能您的应用没有正确关闭索引读写器。 我在Lucene邮件列表中看到过很多这样的故事,而且几乎总是应用程序的责任,而不是Lucene本身。
使用复合索引来减少文件数量。 当这个标志被设置时,lucene会将一个段写成单个.cfs文件而不是多个文件。 这将显着减少文件数量。
IndexWriter.setUseCompoundFile(true)