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

时间:2013-05-27 10:22:14

标签: azure lucene.net azure-storage

我正在尝试在Azure Web角色中使用最新版本的Lucene.NET(通过NuGet应用于我的项目)。 原始Web应用程序(MVC4)已创建为能够在传统Web主机或Azure中运行:在前一种情况下,它使用基于文件系统的Lucene目录,将Lucene索引写入* App_Data *子目录;在后一种情况下,它使用从NuGet安装的AzureDirectory( Lucene.Net.Store.Azure )。

被索引的文档要么来自网络,要么来自本地上传的一些文件,因为要索引的一些集合是关闭的而且相当小。首先,我尝试使用其中一个小型封闭集,计算几千GB的大约1,000个文件。

当我在开发环境中本地索引此集时,索引已完成,我可以 成功使用它进行搜索。相反,当我尝试在Azure上编制索引时,它无法完成,我不知道确切的问题:我添加了Elmah和NLog来记录任何问题,但没有任何内容在Elmah或Azure控制台配置的监视工具中注册。只有当我从NLog获得错误时,Lucene索引编写者在进程结束时抛出文件添加时才会出现内存不足异常。所以我试过了:

  • 显式设置一个非常低的RAM缓冲区大小调用 我的作家上的 SetRAMBufferSizeMB(10.0)
  • 多次提交,例如每增加200个文件。
  • 在索引编制完成后删除对 Optimize 的任何调用(另请参阅http://blog.trifork.com/2011/11/21/simon-says-optimize-is-bad-for-you/)。
  • 定位文件系统或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()。如果测试需要,我会在最后的 Dispose 之前多次调用 writer.Commit();这通常有助于系统在遇到内存异常之前继续运行。 任何人都可以提出一个提示,以便能够完成我的索引吗?

1 个答案:

答案 0 :(得分:0)

错误似乎占据了关键:Lucene在编制索引时内存不足。

从我的角度来看,你有两个选择:

您可以尝试在几种不同的配置(更多RAM与更少的文档)之间对索引作业进行单元测试,直到您为应用程序提供合适的组合。

另一方面,如果问题严格来自Azure服务器,您可能希望尝试使用本地文件缓存而不是RAM缓存。