C# lucene.net 64位OutOfMemoryException

C# lucene.net 64位OutOfMemoryException,c#,64-bit,lucene.net,C#,64 Bit,Lucene.net,我有一个Lucene索引,它是313MB,通过ASP.NET网站在64位以下运行。当我启动应用程序并使用下面的CreateLuceneIndex()方法中的IndexReader.Open(directory,true)读入索引时,我看到IIS Express工作进程膨胀到超过4GB,然后砰的一声——OutOfMemoryException 有人能解释一下为什么以及我需要做什么来解决这个问题吗?当实际索引大小只有313MB时,为什么会发生这种情况 注意:该容器是DI容器() private vo

我有一个Lucene索引,它是313MB,通过ASP.NET网站在64位以下运行。当我启动应用程序并使用下面的CreateLuceneIndex()方法中的
IndexReader.Open(directory,true)
读入索引时,我看到IIS Express工作进程膨胀到超过4GB,然后砰的一声——OutOfMemoryException

有人能解释一下为什么以及我需要做什么来解决这个问题吗?当实际索引大小只有313MB时,为什么会发生这种情况

注意:该容器是DI容器()

private void CreateLuceneIndex(容器)
{
var directory=CreateDirectory();
var indexWriter=CreateIndexWriter(容器、目录);
//index writer.DeleteAll();
//var fieldDictionary=CreateIndexFieldDictionary();
//PopulateLuceneIndex(indexWriter,fieldDictionary);
index writer.Dispose();
Register(newindexsearch(IndexReader.Open(directory,true));
}
私有目录CreateDirectory()
{
var useAzureBlob=\u appSettings.Get(“UseAzureBLOBStorage”,false);
var blobStorageEndpoint=\u appSettings.Get(“blobStorage”,string.Empty);
var directory=useAzureBlob
?(目录)
新AzureDirectory(CloudStorageAccount.Parse(blobStorageEndpoint),“目录”)
:new MMapDirectory(new DirectoryInfo(Environment.CurrentDirectory));
返回目录;
}
专用IndexWriter CreateIndexWriter(容器容器、目录)
{
Register(新的StandardAnalyzer(Lucene.Net.Util.Version.Lucene_30));
var分析仪=container.TryResolve();
var indexWriter=new indexWriter(目录、分析器、indexWriter.MaxFieldLength.UNLIMITED);
indexWriter.SetRAMBufferSizeMB(10.0);
返回索引器;
}

我还没有弄清楚原因,但我发现从
MMapDirectory
更改为
FSDirectory
解决了我的问题。

什么是
容器
?它有什么作用?没有它你会得到同样的异常吗?这是一个DI容器:Funq-最后一个问题是“没有它你会得到同样的异常吗?”?好问题-是的,我做了,刚刚测试过..很难想象,当操作系统的分页文件不能大到足以提供备份存储时,64位进程在OOM上死亡。堆栈跟踪非常重要,这可能是Lucene本身引发的异常。
private void CreateLuceneIndex(Container container)
{
    var directory = CreateDirectory();
    var indexWriter = CreateIndexWriter(container, directory);
    //indexWriter.DeleteAll();

    //var fieldDictionary = CreateIndexFieldDictionary();

    //PopulateLuceneIndex(indexWriter, fieldDictionary);

    indexWriter.Dispose();

    container.Register(new IndexSearcher(IndexReader.Open(directory, true)));
}

private Directory CreateDirectory()
{
    var useAzureBlob = _appSettings.Get("UseAzureBLOBStorage", false);
    var blobStorageEndpoint = _appSettings.Get("blobStorage", string.Empty);

    var directory = useAzureBlob
        ? (Directory)
            new AzureDirectory(CloudStorageAccount.Parse(blobStorageEndpoint), "Catalogue")
            : new MMapDirectory(new DirectoryInfo(Environment.CurrentDirectory));

    return directory;
}

private IndexWriter CreateIndexWriter(Container container, Directory directory)
{
    container.Register<Analyzer>(new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30));
    var analyser = container.TryResolve<Analyzer>();

    var indexWriter = new IndexWriter(directory, analyser, IndexWriter.MaxFieldLength.UNLIMITED);
    indexWriter.SetRAMBufferSizeMB(10.0);

    return indexWriter;
}