Тормозит Lucene.NET при индексации

okis

Проблема следующая:
Индексирую документы. ~1M записей, запись — строка из нескольких слов.

foreach (var dataList in lists)
{
// в dataList — ~200K записей
ResultItem[] items = dataList.ToArray;
foreach (ResultItem item in items)
{
indexSize++;
count++;
if (count % 1000 == 0)
Console.WriteLine("Indexed {0} docs, avg {1}s/doc, total: {2}s, total_idx: {3}, isize: {4}", count, Math.RoundDateTime.Now - start).TotalSeconds / count, 5).ToString Math.RoundDateTime.Now - start).TotalSeconds, 5).ToString Math.Round(totalIndexTime.TotalSeconds, 5).ToString indexSize);

var doc = new Lucene.Net.Documents.Document;
var field = new Lucene.Net.Documents.Field("text", item.name, Lucene.Net.Documents.Field.Store.YES, Lucene.Net.Documents.Field.Index.TOKENIZED);
field.SetOmitNorms(true);
doc.Add(field);

DateTime dtIndexStart = DateTime.Now;
if (useRamDir)
ramWriter.AddDocument(doc);
else
diskWriter.AddDocument(doc);
TimeSpan ts = (DateTime.Now - dtIndexStart);
totalIndexTime = totalIndexTime.Add(ts);
}
}
if (useRamDir)
{
indexSize = 0;
Console.WriteLine("Folding index…");
FoldToDisk(ramDir, ramWriter, diskWriter);
ramDir = new Lucene.Net.Store.RAMDirectory;
ramWriter = new IndexWriter(ramDir, analyzer, true);
}
//Console.WriteLine("Performing GC…");
//GC.Collect;
}


Данный код, как при использовании RAMDirectory, так и без, после 100К документов жутко тормозит, грешил на сборщик мусора, но не в нём дело. Тормозит — значит тратит более 0.02с на индексацию очередной строки.
На Java то же самое запускать ещё не пробовал.

bav46

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

okis

Там всё из памяти берётся :(

using (var file = File.OpenRead(CacheFileName
{
Data = ProtoBuf.Serializer.Deserialize<List<ResultItem>>(file);
}



List<List<ResultItem>> lists = new List<List<ResultItem>>
var list = new List<ResultItem>
lists.Add(list);
int countVal = 0;
foreach (var @value in Data.Values)
{
list.Add(@value);
if (list.Count == foldCount)
{
list = new List<ResultItem>
lists.Add(list);
}
countVal++;
}

ResultItem — сериализуемая структура.

okis

Проблема решилась обновлением Lucene.NET до версии 2.9.
Оставить комментарий
Имя или ник:
Комментарий: