あなたのコードを見たり、データについて何も知らなくても、私は問題を推測することしかできませんが、これはおそらく 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 インデックスに移行されます。
ソース: