Lucene &引用;打开的文件太多错误“;在Java8上运行应用程序时点击

Lucene &引用;打开的文件太多错误“;在Java8上运行应用程序时点击,lucene,java-8,Lucene,Java 8,我有一个基于Lucene自定义实现的搜索引擎,不幸的是我仍然使用Lucene 3.0.3,我无法更改它,原因超出了这个问题的范围。 现在我需要从Java 6迁移到Java 8,但是当我使用Java 8 JVM运行索引时,我遇到了“打开的文件太多问题”,如下所示: java.io.FileNotFoundException: /myIndex/_27c.fdx (Too many open files) at java.io.RandomAccessFile.open0(Native Me

我有一个基于Lucene自定义实现的搜索引擎,不幸的是我仍然使用Lucene 3.0.3,我无法更改它,原因超出了这个问题的范围。 现在我需要从Java 6迁移到Java 8,但是当我使用Java 8 JVM运行索引时,我遇到了“打开的文件太多问题”,如下所示:

java.io.FileNotFoundException: /myIndex/_27c.fdx (Too many open files)
    at java.io.RandomAccessFile.open0(Native Method)
    at java.io.RandomAccessFile.open(RandomAccessFile.java:333)
    at java.io.RandomAccessFile.<init>(RandomAccessFile.java:257)
    at org.apache.lucene.store.SimpleFSDirectory$SimpleFSIndexOutput.<init>(SimpleFSDirectory.java:180)
    at org.apache.lucene.store.NIOFSDirectory.createOutput(NIOFSDirectory.java:85)
    at org.apache.lucene.index.FieldsWriter.<init>(FieldsWriter.java:86)
    at org.apache.lucene.index.StoredFieldsWriter.initFieldsWriter(StoredFieldsWriter.java:66)
    at org.apache.lucene.index.StoredFieldsWriter.finishDocument(StoredFieldsWriter.java:144)
    at org.apache.lucene.index.StoredFieldsWriter$PerDoc.finish(StoredFieldsWriter.java:192)
    at org.apache.lucene.index.DocumentsWriter$WaitQueue.writeDocument(DocumentsWriter.java:1559)
    at org.apache.lucene.index.DocumentsWriter$WaitQueue.add(DocumentsWriter.java:1578)
    at org.apache.lucene.index.DocumentsWriter.finishDocument(DocumentsWriter.java:1155)
    at org.apache.lucene.index.DocumentsWriter.updateDocument(DocumentsWriter.java:832)
    at org.apache.lucene.index.DocumentsWriter.updateDocument(DocumentsWriter.java:807)
    at org.apache.lucene.index.IndexWriter.updateDocument(IndexWriter.java:2155)
java.io.FileNotFoundException:/myIndex/_27c.fdx(打开的文件太多)
位于java.io.RandomAccessFile.open0(本机方法)
位于java.io.RandomAccessFile.open(RandomAccessFile.java:333)
位于java.io.RandomAccessFile。(RandomAccessFile.java:257)
位于org.apache.lucene.store.SimpleFSDirectory$SimpleFSIndexOutput。(SimpleFSDirectory.java:180)
位于org.apache.lucene.store.NIOFSDirectory.createOutput(NIOFSDirectory.java:85)
位于org.apache.lucene.index.FieldsWriter.(FieldsWriter.java:86)
位于org.apache.lucene.index.StoredFieldsWriter.initFieldsWriter(StoredFieldsWriter.java:66)
位于org.apache.lucene.index.StoredFieldsWriter.finishDocument(StoredFieldsWriter.java:144)
位于org.apache.lucene.index.StoredFieldsWriter$PerDoc.finish(StoredFieldsWriter.java:192)
位于org.apache.lucene.index.DocumentsWriter$WaitQueue.writeDocument(DocumentsWriter.java:1559)
位于org.apache.lucene.index.DocumentsWriter$WaitQueue.add(DocumentsWriter.java:1578)
位于org.apache.lucene.index.DocumentsWriter.finishDocument(DocumentsWriter.java:1155)
位于org.apache.lucene.index.DocumentsWriter.updateDocument(DocumentsWriter.java:832)
位于org.apache.lucene.index.DocumentsWriter.updateDocument(DocumentsWriter.java:807)
位于org.apache.lucene.index.IndexWriter.updateDocument(IndexWriter.java:2155)
我的系统上的ulimit是80.000个文件,当我运行lsof时,我得到打开的文件属于索引,它们被标记为(删除的)段。 我知道有很多关于Lucene open files问题的问题、答案和博客,但是:

  • 我已经尝试过任何推荐的方法(查看代码以查找open IndexWriter、增加ulimit、启用 复合文件,将段数从10减少到4,查看打开文件的代码),但没有成功,并且
  • java6没有出现这个问题,所以我猜问题在于java8如何处理文件

以前有人用Java8遇到过这个问题吗?关于如何进一步解决此问题或原因的任何其他想法?

我会检查您是否正在打开
索引阅读器,但没有关闭它。请记住,关闭
indexsearch
不会关闭底层读取器。@femtoRgon-我已经检查过了,但是请注意,应用程序在Java6上运行良好。如果我让一些文件保持打开状态,我希望在Java6中也会看到问题,而不仅仅是在Java8中。您还没有关闭可能通过InputStream打开的文件file@AR1-是的,我确实看到了,但老实说,我不太确定我是否买了它。Java8中可能有某种东西加剧了现有的问题。如果在Java6中有70000个文件句柄保持打开状态,而在Java8中有80000个文件句柄保持打开状态,那么无论哪种情况,都会出现资源泄漏,应该找到原因。