Слишком много открытых файлов Ошибка в Lucene - PullRequest
4 голосов
/ 02 июня 2011

Проект, над которым я работаю, индексирует определенное количество данных (с длинными текстами) и сравнивает их со списком слов за интервал (от 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 строк длинных текстов, возникает та же ошибка. Но это произошло только один раз.

Должен ли я следовать совету по изменению mergeFactor Lucene IndexWriter из (слишком много открытых файлов) - SOLR или это проблема количества индексируемых данных?

Я также читал, что это выбор между пакетной индексацией или интерактивной индексацией. Как определить, является ли индексирование интерактивным, просто по частым обновлениям? Стоит ли тогда относить этот проект к категории интерактивной индексации?

ОБНОВЛЕНИЕ: я добавляю фрагмент моего IndexWriter:

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

Похоже, что maxMerge (? Или длина поля ...) уже установлен на неограниченное количество.

Ответы [ 3 ]

2 голосов
/ 01 июля 2011

Я уже использовал ulimit, но ошибка все еще показывает. Затем я проверил настроенные основные адаптеры для функций lucene. Оказывается, существует слишком много каталогов IndexWriter.open, которые ОТКРЫТЫ ВЛЕВО.

Следует учесть, что после обработки всегда будет вызываться при закрытии открытой директории.

1 голос
/ 03 июня 2011

Необходимо дважды проверить, действительно ли значение ulimit сохранено и установить правильное значение (какой бы максимум не было).

Весьма вероятно, что ваше приложение не закрывает индексные устройства чтения / записи должным образом. Я видел много подобных историй в списке рассылки Lucene, и почти всегда виноват был пользовательский пакет, а не сам Lucene.

0 голосов
/ 07 июня 2011

Используйте составной индекс, чтобы уменьшить количество файлов.Когда этот флаг установлен, lucene запишет сегмент как один файл .cfs вместо нескольких файлов.Это значительно уменьшит количество файлов.

IndexWriter.setUseCompoundFile(true) 
...