C# lucene.net 64位OutOfMemoryException
我有一个Lucene索引,它是313MB,通过ASP.NET网站在64位以下运行。当我启动应用程序并使用下面的CreateLuceneIndex()方法中的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
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;
}