4

django 1.4、Haystack 2 ベータ、および ElasticSearch .20 でセットアップを実行しています。私のデータベースは postgresql 9.1 で、数百万のレコードがあります。haystack/elasticsearch を使用してすべてのデータのインデックスを作成しようとすると、プロセスがタイムアウトし、"Killed" というメッセージが表示されます。これまでのところ、次のことに気付きました。

  1. インデックスを作成するドキュメントの数を取得するので、「インデックスを作成するドキュメントはありません」のようなエラーは発生しません。
  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

これらすべてのレコードのインデックスを作成しようとしたときに、プロセスが消費するメモリを見たことがありますか? 通常、「Kill​​ed」と表示されている場合は、システムのメモリが不足しており、OOM キラーがシステム リソースを解放するためにプロセスを強制終了することを決定したことを意味します。

于 2013-01-28T20:25:33.670 に答える