4

私が取り組んでいるプロジェクトでは、一定数のデータ (長いテキストを含む) のインデックスを作成し、それらを間隔 (約 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 を(Too many open files) - SOLRから変更するというアドバイスに従うべきですか、それともインデックスが作成されるデータの量に関する問題ですか?

また、バッチ インデックス作成と対話型インデックス作成のどちらかを選択できることも読みました。頻繁に更新するだけで、インデックス作成がインタラクティブかどうかをどのように判断できますか? では、このプロジェクトをインタラクティブなインデックス作成の下に分類する必要がありますか?

更新: IndexWriter のスニペットを追加しています:

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

maxMerge (? またはフィールド長...) は既に無制限に設定されているようです。

4

3 に答える 3

2

すでに ulimit を使用していますが、エラーがまだ表示されます。次に、lucene 関数用にカスタマイズされたコア アダプターを調べました。LEFT OPEN の IndexWriter.open ディレクトリが多すぎることが判明しました。

処理後、開いているディレクトリを閉じるときに常に呼び出されることに注意してください。

于 2011-07-01T05:32:39.007 に答える
1

ulimit値が実際に永続化され、適切な値 (最大値に関係なく) に設定されているかどうかを再確認する必要があります。

アプリがインデックス リーダー/ライターを適切に閉じていない可能性が非常に高いです。Lucene メーリング リストでこのような話をたくさん見てきましたが、ほとんどの場合、Lucene 自体ではなく、ユーザー アプリに問題がありました。

于 2011-06-02T22:50:56.327 に答える
0

複合インデックスを使用してファイル数を減らします。このフラグが設定されている場合、lucene は複数のファイルではなく単一の .cfs ファイルとしてセグメントを書き込みます。これにより、ファイル数が大幅に削減されます。

IndexWriter.setUseCompoundFile(true) 
于 2011-06-07T08:20:15.420 に答える