Header
2019-06-22
2019-08-22

Ruby on Railsで大量データを繰り返し処理する場合find_eachやin_batchesを使おう

2019 06 22 1210

Ruby on RailsのORマッパーであるActiveRecordは便利であるがゆえに、大量データを扱う場合重くなったりします。

今回は大量データを扱う場合にすぐに利用できるメソッドの findeachとかinbatchesを解説します。

繰り返し処理の場合はeachよりfind_each

each処理は処理前に大量のインスタンスがメモリに展開します。

そのため、数十万レコードなどのデータをRailsのeachで取得しようとすると、メモリを大量に消費しサービスの動作が停止したり、ユーザーの画面が一時的に真っ白になるなどの悪影響が発生します。

上記から大量データを単純に繰り返し処理する場合はfind_eachで取得します。

find_eachはデフォルトで1000件づつ処理を行うので、メモリ消費を抑えることが可能です。

Articles.find_each do |article|
  p article
end

limitとorderは利用することができないのでご注意ください

Rails5以降の場合はin_batchesを利用する

in_batchesはActiveRecord::Relationを利用します。

ActiveRecord::Relationは実際にデータが必要になるまでデータベースにはアクセスしない、遅延ロードとなります。

繰り返し処理内でActiveRecord::Relationから利用できるメソッドを利用する際はin_batchesを利用することをオススメします。

 Article.in_batches do |article|
  p article
end

以下実行結果

  (2.0ms)  SELECT  `articles`.`id` FROM `articles` ORDER BY `articles`.`id` ASC LIMIT 1000

Article Load (0.9ms)  SELECT `articles`.* FROM `articles` WHERE `articles`.`id` IN (1, 2, 3, 4, 5, 6, 39, 41, 42, 45, 48, 52, 56, 64, 65, 71, 72, 73) 

#<ActiveRecord::Relation [#<Article id: 1,
slug: nil>, ...]>

その他関連記事

Carrierwave+S3で複数画像をアップロードする|Ruby on Rails5  

DjangoでMySQLを利用する|初心者・独学者向け入門コンテンツ

Ruby on Rails でデータを取得するメソッド一覧

【初心者・独学者向け】Ruby on Railsで使いやすいメソッド.present?の紹介

Ruby on Rails4で簡易ブログを作成する1 | VIew Controller ルートを作成する

【初心者・独学者向け】Ruby on Railsで中間テーブルを作成し、多対多を実現する

前の記事
次の記事
人気記事
カテゴリーから記事を探す