Django Haystack / ElasticSearch索引过程中止

时间:2013-01-26 01:40:10

标签: python django elasticsearch django-haystack

我正在运行django 1.4,Haystack 2 beta和ElasticSearch .20的设置。我的数据库是postgresql 9.1,它有几百万条记录。当我尝试使用haystack / elasticsearch索引我的所有数据时,该过程超时并且我收到一条只显示“已杀死”的消息。到目前为止,我已经注意到以下几点:

  1. 我确实得到了要编入索引的文档数量,因此我没有收到类似“0索引文档”的错误。
  2. 索引一个小集合,例如1000,可以正常工作。
  3. 我尝试在haystack/backends/__init__.py中对超时进行硬编码,这似乎没有效果。
  4. 我尝试更改elasticsearch.yml中的选项也无济于事。
  5. 如果硬编码超时不起作用,那么我怎样才能延长索引时间?还有另一种方法可以在ElasticSearch中直接更改吗?或者也许是一些批处理方法?

    提前致谢!

3 个答案:

答案 0 :(得分:6)

我冒昧地说问题是生成要发送到ElasticSearch的文档,使用batch-size选项会帮助你解决问题。

ElasticSearch backend中的update方法准备要从每个提供的查询集索引的文档,然后为该查询集执行单个批量插入。

self.conn.bulk_index(self.index_name, 'modelresult', prepped_docs, id_field=ID)

所以看起来如果你有一张包含数百万条记录的表,那么在该索引模型上运行update_index意味着你需要生成数百万个文档然后将它们编入索引。我敢冒险这就是问题所在。使用--batch-size选项设置批量限制应限制批量大小的查询集切片生成的文档。

答案 1 :(得分:2)

这个版本的草垛是错误的。导致该问题的代码行在以下行的haystack / management / commands / update_index.py文件中找到:

pks_seen = set([smart_str(pk) for pk in qs.values_list('pk', flat=True)])

导致服务器内存不足。但是,对于索引,似乎不需要。所以,我把它改成了:

pks_seen = set([])

现在正在批量运行。谢谢大家的回答!

答案 2 :(得分:1)

当您尝试索引所有这些记录时,您是否看过流程正在消耗的内存?通常,当您看到“已杀死”时,表示您的系统内存不足,而the OOM killer已决定终止您的进程以释放系统资源。