索引时Zend Lucene耗尽了内存

时间:2011-09-11 12:36:04

标签: php memory-management zend-search-lucene

我正在维护的旧网站使用Zend Lucene(ZF 1.7.2)作为搜索引擎。我最近添加了两个要编制索引的新表,一起包含大约2000行文本数据,范围在31字节到63kB之间。

索引工作正常几次,但是在第三次运行之后,由于耗尽了已分配的内存,它开始因致命错误而终止。 PHP内存限制最初设置为16M,这足以索引所有其他内容,每行几千字节的200行文本。我逐渐将内存限制增加到160M,但仍然不够,我不能再提高它。

索引时,我首先需要清除以前索引的结果,因为路径方案包含Lucene似乎将其视为停用词的数字,当我运行此搜索时返回每个条目:

$this->index->find('url:/tablename/12345');

清除所有结果后,我逐个重新插入:

foreach($urls as $v) {
   $doc = new Zend_Search_Lucene_Document();
   $doc->addField(Zend_Search_Lucene_Field::UnStored('content', $v['data']);
   $doc->addField(Zend_Search_Lucene_Field::Text('title', $v['title']);
   $doc->addField(Zend_Search_Lucene_Field::Text('description', $v['description']);
   $doc->addField(Zend_Search_Lucene_Field::Text('url', $v['path']);
   $this->index->addDocument($doc);
}

经过大约一千次迭代后,索引器耗尽内存并崩溃。奇怪地将内存限制加倍只能帮助几十行。

我已经尝试调整MergeFactor和MaxMergeDocs参数(分别为5和100)并每100行调用$this->index->optimize(),但两者都没有提供一致的帮助。

清除整个搜索索引并重建它似乎可以在大多数情况下成功编制索引,但我更喜欢更优雅且CPU占用更少的解决方案。有什么我做错了吗?索引占用如此多的内存是否正常?

1 个答案:

答案 0 :(得分:1)

我有一个类似的问题,我必须维护的网站至少有三种不同的语言,并且必须分别为每个不同的语言环境重新索引相同的10'000 +(和不断增长的)本地化文档(每个都使用自己的本地化搜索引擎)。可以说它通常在第二次通过中失败。

我们最终实现了一个基于Ajax的重新索引过程,该过程首次调用脚本来初始化并开始重新索引。该脚本在预定义数量的已处理文档中止,并返回一个JSON值,指示它是否已完成,以及其他进度信息。然后,我们再次使用进度变量重新调用相同的脚本,直到脚本返回完成状态。

这也允许管理区域的进程的进度条。

对于cron作业,我们只是使用退出代码创建了一个bash脚本执行相同的任务。

这是大约3年前的事情,从那以后一切都没有失败。