Django Haystack/ElasticSearch 索引过程终止
我正在使用django 1.4、Haystack 2 beta和ElasticSearch .20进行设置。我的数据库是postgresql 9.1,里面有几百万条记录。当我尝试用haystack/elasticsearch对所有数据进行索引时,过程超时了,系统只给我发了个“Killed”的消息。到目前为止,我注意到了以下几点:
- 我确实能看到要索引的文档数量,所以并不是出现了“没有文档需要索引”的错误。
- 索引一小部分数据,比如1000条,是没问题的。
- 我尝试在
haystack/backends/__init__.py
里硬编码超时时间,但似乎没有任何效果。 - 我也尝试在elasticsearch.yml中更改选项,但也没用。
如果硬编码超时时间不管用,那我还有什么其他方法可以延长索引时间呢?有没有办法直接在ElasticSearch中更改这个?或者说有没有批处理的方法?
提前谢谢你们!
3 个回答
你有没有注意到,当你尝试处理所有那些记录时,你的程序消耗了多少内存?通常,当你看到“被杀死”这个提示时,意味着你的系统内存不够用了,这时候系统会启动一个叫做OOM杀手的东西,它会结束你的程序,以释放一些系统资源。
我觉得问题出在生成要发送给ElasticSearch的文档上,使用batch-size
这个选项可能会对你有帮助。
update
方法在ElasticSearch后端中,会从每个提供的查询集中准备要索引的文档,然后对这个查询集进行一次批量插入。
self.conn.bulk_index(self.index_name, 'modelresult', prepped_docs, id_field=ID)
所以,如果你有一个包含数百万条记录的表,运行update_index
这个命令在那个被索引的模型上,就意味着你需要生成这数百万个文档,然后再进行索引。我觉得这就是问题所在。通过设置--batch-size
选项来限制批量大小,可以控制生成的文档数量,避免一次性处理太多。
这个版本的haystack有一些问题。导致出错的代码在文件haystack/management/commands/update_index.py中的这一行:
pks_seen = set([smart_str(pk) for pk in qs.values_list('pk', flat=True)])
这行代码让服务器的内存用完了。不过,在进行索引时,这行代码似乎并不是必需的。所以,我把它改成了:
pks_seen = set([])
现在它可以顺利处理批量数据了。感谢所有回答的人!