【问题标题】:Too many open files Error on LuceneLucene 上打开的文件太多错误
【发布时间】:2011-09-06 19:26:23
【问题描述】:

我正在进行的项目是索引一定数量的数据(带有长文本)并将它们与每个间隔(大约 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 行长文本时,会出现同样的错误。但它只发生过一次。

我应该遵循从 (Too many open files) - SOLR 修改 Lucene IndexWriter 的 mergeFactor 的建议,还是这是索引数据量的问题?

我还读到它是批量索引或交互式索引之间的选择。 仅通过频繁更新,如何确定索引是否是交互式的? 那我应该把这个项目归类到交互式索引下吗?

更新:我正在添加我的 IndexWriter 的 sn-p:

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

似乎 maxMerge(?或字段长度...)已设置为无限制。

【问题讨论】:

    标签: linux indexing lucene ioexception file-not-found


    【解决方案1】:

    您需要仔细检查ulimit 值是否实际上已被持久化并设置为适当的值(无论最大值是多少)。

    您的应用很可能没有正确关闭索引读取器/写入器。我在 Lucene 邮件列表中看到过很多这样的故事,而且几乎总是应该归咎于用户应用程序,而不是 Lucene 本身。

    【讨论】:

      【解决方案2】:

      使用复合索引来减少文件数。设置此标志时,lucene 会将一个段写入单个 .cfs 文件而不是多个文件。这将显着减少文件数量。

      IndexWriter.setUseCompoundFile(true) 
      

      【讨论】:

        【解决方案3】:

        我已经使用了 ulimit 但仍然显示错误。 然后我检查了 lucene 功能的定制核心适配器。 原来有太多的 IndexWriter.open 目录是 LEFT OPEN。

        需要注意的是,处理完后,会一直调用关闭打开的目录。

        【讨论】:

        • 嗨,我是 Lucene 的新手。你的意思是调用writer.close() 还是writer.getDirectory().close()
        • 作家和作家的目录都应该在使用后关闭。我有一些打开的目录访问权限,这就是为什么我有太多打开的文件错误。 =]
        • 有趣的是,我已经完成了这里建议中所说的所有内容,但我仍然遇到同样的错误。
        猜你喜欢
        • 2019-02-23
        • 1970-01-01
        • 1970-01-01
        • 2014-10-03
        • 2010-12-07
        • 1970-01-01
        • 2014-06-23
        • 2016-03-17
        • 1970-01-01
        相关资源
        最近更新 更多