4

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

  1. 我确实获得了要编入索引的文档数量,所以我没有收到类似“0 个要索引的文档”之类的错误。
  2. 索引一个小集合,例如 1000,工作得很好。
  3. 我试过硬编码超时haystack/backends/__init__.py,这似乎没有效果。
  4. 我尝试更改 elasticsearch.yml 中的选项也无济于事。

如果硬编码超时不起作用,那么我还能如何延长索引时间?是否有另一种方法可以直接在 ElasticSearch 中进行更改?或者也许是一些批处理方法?

提前致谢!

4

3 回答 3

6

我敢肯定,问题在于生成要发送到 ElasticSearch 的文档,并且使用该batch-size选项将帮助您。

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

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

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

于 2013-02-01T20:28:15.760 回答
2

这个版本的 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([])

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

于 2013-02-04T06:47:00.593 回答
1

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

于 2013-01-28T20:25:33.670 回答