Lucene.NET 3和Azure:无法完成索引
我试图在Azure web角色中使用最新版本的Lucene.NET(通过NuGet应用于我的项目)。 原始web应用程序(MVC4)已创建为能够在传统web主机或Azure中运行:在前一种情况下,它使用基于文件系统的Lucene目录,将Lucene索引写入*App_Data*子目录;在后一种情况下,它使用从NuGet(Lucene.Net.Store.Azure)安装的AzureDirectory 正在编制索引的文档要么来自web,要么来自本地上传的一些文件,因为要编制索引的一些集合是关闭的,而且相当小。首先,我尝试使用这些小型封闭集中的一个,计算出大约1000个文件的容量为几GB 当我在我的开发环境中本地索引这个集合时,索引就完成了,我可以 成功使用它进行搜索。相反,当我尝试在Azure上建立索引时,它无法完成,我对确切的问题没有任何线索:我添加了Elmah和NLog以记录任何问题,但没有在Elmah或Azure控制台配置的监视工具中注册任何内容。只有一次我从NLog得到一个错误,这是Lucene index writer在提交文档添加时在进程结束时抛出的内存不足异常。所以我试着:Lucene.NET 3和Azure:无法完成索引,azure,lucene.net,azure-storage,Azure,Lucene.net,Azure Storage,我试图在Azure web角色中使用最新版本的Lucene.NET(通过NuGet应用于我的项目)。 原始web应用程序(MVC4)已创建为能够在传统web主机或Azure中运行:在前一种情况下,它使用基于文件系统的Lucene目录,将Lucene索引写入*App_Data*子目录;在后一种情况下,它使用从NuGet(Lucene.Net.Store.Azure)安装的AzureDirectory 正在编制索引的文档要么来自web,要么来自本地上传的一些文件,因为要编制索引的一些集合是关闭的,而
- 显式设置非常低的RAM缓冲区大小调用 在我的writer上设置RambufferSizeMB(10.0)李>
- 提交多次,例如每添加200个文档李>
- 在索引完成后删除任何优化调用(另请参见此部分)
- 目标是文件系统或Azure存储
- 将web角色VM升级到大型
IndexWriter writer = new IndexWriter(directory, analyzer, IndexWriter.MaxFieldLength.UNLIMITED);
writer.SetRAMBufferSizeMB(10.0);
其中,根据正在执行的测试,directory是FSDirectory或AzureDirectory的实例。然后,我添加文档及其字段(使用UpdateDocument,因为其中一个字段表示唯一的ID)。完成后,我调用writer.Dispose()。如果测试需要,我会在最终处置之前多次调用writer.Commit();这通常有助于系统在遇到内存异常之前继续运行。
有人能给我一个提示来完成我的索引吗?这个错误似乎抓住了关键:Lucene在索引时内存不足 在我看来,你有两个选择:
- 为RAM缓冲区分配更多内存,这实际上提高了性能(请参阅)或
- 减少每次提交之间的文档数量
另一方面,如果问题完全出在Azure服务器上,您可能希望尝试使用本地文件缓存而不是RAM缓存。索引失败的原因是什么?简单地说,编写器的提交方法抛出OutOfMemoryException。谢谢,实际上我通过将应用程序移动到非Azure服务器(Windows server 2008 R2)进行了测试它运行良好,就像在我的开发工作站中一样。Azure服务器存在BLOB存储和本地文件存储问题。我尝试提交每300、100、50个文档,但结果各不相同,索引从未完成。最重要的是,我想知道为什么RAM缓冲区大小设置的treshold不足以防止内存不足异常:是否应该正确使用它来防止RAM过度使用;但似乎
OutOfMemoryException
s发生在Azure服务器上,而不是在您的服务器上,即RAM限制设置为。。。换句话说,此时RAM的大小可能并不重要。问题出在Azure方面。