有趣的Lucene.net异常

本文关键字:net 异常 Lucene | 更新日期: 2023-09-27 18:11:40

根据这个或这个,我通过多个线程使用了相同的indexsearcher。但是当我从FsDirectory切换到MMapDirectory时,我得到了有趣的异常。

这个工作很好:

static void Main(string[] args) 
{
    DirectoryInfo directoryInfo = new DirectoryInfo(@"C:'Users'Tams'Desktop'new'");
    var directory = FSDirectory.Open(directoryInfo);
    var indexSearcher = new IndexSearcher(directory);
    const int times = 100;
    const int concurrentTaskCount = 5;
    var task = new Task[concurrentTaskCount];
    for (int i = 0; i < concurrentTaskCount; i++) 
    {
        task[i] = new Task(() => Search(indexSearcher, times));
        task[i].Start();
    }
    Task.WaitAll(task);
}
static void Search(IndexSearcher reader, int times) 
{
    List<Document> docs = new List<Document>(10000);
    for (int i = 0; i < times; i++) 
    {
        var q = new TermQuery(new Term("title", "volume"));
        foreach (var scoreDoc in reader.Search(q, 100).ScoreDocs)
        {
            docs.Add(reader.Doc(scoreDoc.Doc));
        }
    }
}

但是这个:

static void Main(string[] args)
 {
    DirectoryInfo directoryInfo = new DirectoryInfo(@"C:'Users'Tams'Desktop'new'");
    var directory = new MMapDirectory(directoryInfo); // CHANGED
    var indexSearcher = new IndexSearcher(directory);
    const int times = 100;
    const int concurrentTaskCount = 5;
    var task = new Task[concurrentTaskCount];
    for (int i = 0; i < concurrentTaskCount; i++)
    {
        task[i] = new Task(() => Search(indexSearcher, times));
        task[i].Start();
    }
    Task.WaitAll(task);
}
static void Search(IndexSearcher reader, int times)
 {
    List<Document> docs = new List<Document>(10000);
    for (int i = 0; i < times; i++) 
   {
        var q = new TermQuery(new Term("title", "volume"));
        foreach (var scoreDoc in reader.Search(q, 100).ScoreDocs)
        {
            docs.Add(reader.Doc(scoreDoc.Doc));
        }
    }
}

我得到各种异常,如:

System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative 
                                    and less than the size of the collection.
Parameter name: index
at System.ThrowHelper.ThrowArgumentOutOfRangeException()
at System.Collections.Generic.List`1.get_Item(Int32 index)
at Lucene.Net.Index.FieldInfos.FieldInfo(Int32 fieldNumber)
    in d:'Lucene.Net'FullRepo'trunk'src'core'Index'FieldInfos.cs:line 378   
at Lucene.Net.Index.FieldsReader.Doc(Int32 n, FieldSelector fieldSelector) 
    in d:'Lucene.Net'FullRepo'trunk'src'core'Index'FieldsReader.cs:line 234  
at Lucene.Net.Index.SegmentReader.Document(Int32 n, FieldSelector fieldSelector)
    in d:'Lucene.Net'FullRepo'trunk'src'core'Index'SegmentReader.cs:line 1193
at Lucene.Net.Index.DirectoryReader.Document(Int32 n, FieldSelector fieldSelector)
    in d:'Lucene.Net'FullRepo'trunk'src'core'Index'DirectoryReader.cs:line 686
at Lucene.Net.Index.IndexReader.Document(Int32 n) 
    in d:'Lucene.Net'FullRepo'trunk'src'core'Index'IndexReader.cs:line 732
at Lucene.Net.Search.IndexSearcher.Doc(Int32 i)
    in d:'Lucene.Net'FullRepo'trunk'src'core'Search'IndexSearcher.cs:line 162
at PerformanceTest.Program.Search(IndexSearcher reader, Int32 times)
    in c:'Users'Tams'Documents'Visual Studio 2012'Projects'BookCatalog'PerformanceTest'Program.cs:line 28
at PerformanceTest.Program.<>c__DisplayClass2.<Main>b__0()
    in c:'Users'Tams'Documents'Visual Studio 2012'Projects'BookCatalog'PerformanceTest'Program.cs:line 43
at System.Threading.Tasks.Task.InnerInvoke()
at System.Threading.Tasks.Task.Execute()

System.IO.IOException: read past EOF
at Lucene.Net.Store.BufferedIndexInput.Refill()
    in d:'Lucene.Net'FullRepo'trunk'src'core'Store'BufferedIndexInput.cs:line 179
at Lucene.Net.Store.BufferedIndexInput.ReadByte()
    in d:'Lucene.Net'FullRepo'trunk'src'core'Store'BufferedIndexInput.cs:line 41
at Lucene.Net.Store.IndexInput.ReadVInt()
    in d:'Lucene.Net'FullRepo'trunk'src'core'Store'IndexInput.cs:line 88   
at Lucene.Net.Index.FieldsReader.Doc(Int32 n, FieldSelector fieldSelector)
    in d:'Lucene.Net'FullRepo'trunk'src'core'Index'FieldsReader.cs:line 230  
at Lucene.Net.Index.SegmentReader.Document(Int32 n, FieldSelector fieldSelector)
    in d:'Lucene.Net'FullRepo'trunk'src'core'Index'SegmentReader.cs:line 1193
at Lucene.Net.Index.DirectoryReader.Document(Int32 n, FieldSelector fieldSelector)
    in d:'Lucene.Net'FullRepo'trunk'src'core'Index'DirectoryReader.cs:line 686
at Lucene.Net.Index.IndexReader.Document(Int32 n)
    in d:'Lucene.Net'FullRepo'trunk'src'core'Index'IndexReader.cs:line 732   
at Lucene.Net.Search.IndexSearcher.Doc(Int32 i)
    in d:'Lucene.Net'FullRepo'trunk'src'core'Search'IndexSearcher.cs:line 162
at PerformanceTest.Program.Search(IndexSearcher reader, Int32 times)
    in c:'Users'Tams'Documents'Visual Studio 2012'Projects'BookCatalog'PerformanceTest'Program.cs:line 28
at PerformanceTest.Program.<>c__DisplayClass2.<Main>b__0()
    in c:'Users'Tams'Documents'Visual Studio 2012'Projects'BookCatalog'PerformanceTest'Program.cs:line 43
at System.Threading.Tasks.Task.InnerInvoke()
at System.Threading.Tasks.Task.Execute()

最后的代码运行良好,将concurrentTaskCount变量设置为1。

我错过了什么吗?我不知道那是什么。

实际上,我没有路径

Lucene.Net

d: ' ' FullRepo '主干核心'商店' ' src ' BufferedIndexInput.cs

我甚至没有带字母"d"的驱动器

有趣的Lucene.net异常

MMapDirectory的源代码显示,这个类不像预期的那样使用内存映射文件。它使用MemoryStream对象将所有索引文件加载到内存中,我猜当不同的线程查找和读取时,这些流是问题的原因。

您可以通过将其加载到RAMDirectory中来获得基于内存的索引。这通过了你的测试。(但它做的是MMapDirectory当前做的,不一定是您期望它做的…)

var fsDirectory = FSDirectory.Open(directoryInfo);
var directory = new RAMDirectory(fsDirectory);