0

いくつかの mongo コレクションを WebSolr に再インデックス化しようとしています。小さいコレクションのインデックスは問題なく作成されますが、Sunspot でメモリ不足になることなく大きなコレクション (~15 万ドキュメント) のインデックスを再作成することはできません。モデルを分離して、10 と 5 のバッチを追加しようとしましたが、うまくいきませんでした。

ローカル マシンでこれらを solr のローカル インスタンスにインデックス化できます。

また、ローカル solr インデックスを websolr に移行する方法はありますか?

4

1 に答える 1

2

あなたのコードを見たり、データについて何も知らなくても、私は問題を推測することしかできませんが、これはおそらく Sunspot でデータをロードする方法に問題があるようです.

少し明確にするために、再インデックス操作を実行すると、Sunspot はプライマリ データ ストア (この場合は MongoDB) から読み取り、そのデータを websolr に送信します。のようなものを使用している場合Model.all、Sunspot はそのモデルのすべてのデータをメモリにロードしています。大量のレコードがある場合、R14 エラーが発生しやすく、Heroku はメモリ クォータを超えていると警告します。さらに、ローカルでこの問題が発生しない理由は、Heroku で得られるものと比較して、ローカル マシンで使用できるメモリの量が原因である可能性があります。

これは、バッチ処理が役に立たなかった理由も説明しています。Sunspot でのバッチ処理は、Sunspot がメモリにロードしたデータを取得し、バッチで Solr に送信することを意味します。明らかに、そのデータのメモリ フットプリントが Heroku によって設定されたクォータを既に超えている場合でも、R14 を取得できます。代わりに、メモリ使用量を抑えるために ActiveRecord でバッチ処理を実行する必要があります。

find_each一度にすべてではなくバッチでメモリにデータをロードするメソッドの使用を見てみましょう。つまり、のModel.allようなものに置き換えます。Model.find_each(batch_size: <something>)ここ<something>で、 は R14 エラーを回避するのに十分小さいバッチ サイズです。適切に調整すれば、Heroku のメモリ クォータを超えることなく、すばやくインデックスを再作成できるはずです。

ローカル インデックスを websolr にロードすることに関する質問に関しては、いつheroku configでもWEBSOLR_URL. 次に、この URL を指すようにローカルの Sunspot を構成して、rake sunspot:reindex. これにより、データがローカル環境から websolr インデックスに移行されます。

ソース:

于 2014-04-17T21:43:18.900 に答える