先日、rake taskを実行した際に、扱うレコード数が多すぎて、サーバーに負荷をかけてしまいました。その解決策として、役立つメソッドを知ったので、まとめています。
メモリ使用量の削減
- find_each
使用例
find_each.rb
Model.find_each do |model|
model.update!(hoge: hoge)
end
1000件ずつレコードを取り出し、1レコードずつブロック内の処理を実行していきます。
Modelの内容を一度にすべて取り出すのではなく、1000件ずつ取り出すので、メモリ使用量を抑えることができます。
batch_sizeオプションを指定する場合(3000件ずつ)
find_each.rb
Model.find_each(batch_size: 3000) do |model|
model.update!(fuga: fuga)
end
取り出す件数を1000件ずつではなく、任意の件数にしたい場合は、batch_sizeオプションを使用することで、変更することができます。
- find_in_batches
使用例
find_in_batches.rb
Model.find_in_batches do |models|
hoge(models)
end
1000件ずつデータを取り出し、1000件のデータの配列として、ブロック内の処理を実行します。find_batchesでも同様に、batch_sizeオプションを使うことで、1回に取り出す件数を変更することができます。