Lucene.NET 3和Azure:无法完成索引

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,要么来自本地上传的一些文件,因为要编制索引的一些集合是关闭的,而

我试图在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在提交文档添加时在进程结束时抛出的内存不足异常。所以我试着:

  • 显式设置非常低的RAM缓冲区大小调用 在我的writer上设置RambufferSizeMB(10.0)
  • 提交多次,例如每添加200个文档
  • 在索引完成后删除任何优化调用(另请参见此部分)
  • 目标是文件系统或Azure存储
  • 将web角色VM升级到大型
这些尝试大多在不同阶段失败:有些时候索引在1-200个文档后停止,有些时候达到8-900个文档;当我幸运的时候,它甚至完成了。这种情况只发生在文件系统上,而从未发生在Azure存储上:我从未幸运地用它完成索引

我的Lucene代码的基本部分非常简单:

IndexWriter writer = new IndexWriter(directory, analyzer, IndexWriter.MaxFieldLength.UNLIMITED);
writer.SetRAMBufferSizeMB(10.0);
其中,根据正在执行的测试,directory是FSDirectory或AzureDirectory的实例。然后,我添加文档及其字段(使用UpdateDocument,因为其中一个字段表示唯一的ID)。完成后,我调用writer.Dispose()。如果测试需要,我会在最终处置之前多次调用writer.Commit();这通常有助于系统在遇到内存异常之前继续运行。
有人能给我一个提示来完成我的索引吗?

这个错误似乎抓住了关键:Lucene在索引时内存不足

在我看来,你有两个选择:

  • 为RAM缓冲区分配更多内存,这实际上提高了性能(请参阅)或

  • 减少每次提交之间的文档数量

您可以尝试在几种不同的配置(更多的RAM和更少的文档)下对索引工作进行单元测试,直到找到适合您的应用程序的组合


另一方面,如果问题完全出在Azure服务器上,您可能希望尝试使用本地文件缓存而不是RAM缓存。

索引失败的原因是什么?简单地说,编写器的提交方法抛出OutOfMemoryException。谢谢,实际上我通过将应用程序移动到非Azure服务器(Windows server 2008 R2)进行了测试它运行良好,就像在我的开发工作站中一样。Azure服务器存在BLOB存储和本地文件存储问题。我尝试提交每300、100、50个文档,但结果各不相同,索引从未完成。最重要的是,我想知道为什么RAM缓冲区大小设置的treshold不足以防止内存不足异常:是否应该正确使用它来防止RAM过度使用;但似乎
OutOfMemoryException
s发生在Azure服务器上,而不是在您的服务器上,即RAM限制设置为。。。换句话说,此时RAM的大小可能并不重要。问题出在Azure方面。