我正在尝试在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索引编写者在进程结束时抛出文件添加时才会出现内存不足异常。所以我试过了:
这些尝试中的大多数在不同阶段失败:有些时候索引在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();这通常有助于系统在遇到内存异常之前继续运行。 任何人都可以提出一个提示,以便能够完成我的索引吗?
答案 0 :(得分:0)
错误似乎占据了关键:Lucene在编制索引时内存不足。
从我的角度来看,你有两个选择:
为RAM缓冲区分配更多内存,这实际上提高了性能(请参阅Lucene documentation on the subject)或
减少每次提交之间的文档数量。
您可以尝试在几种不同的配置(更多RAM与更少的文档)之间对索引作业进行单元测试,直到您为应用程序提供合适的组合。
另一方面,如果问题严格来自Azure服务器,您可能希望尝试使用本地文件缓存而不是RAM缓存。