- Web Engineer
- アウトバウンド営業
- Webエンジニア(経験者)
- Other occupations (18)
- Development
- Business
はじめに
Railsアプリケーションでは、大量のデータを処理する必要があるケースが多くあります。例えば、データの移行、レポートの生成、バッチ更新などが該当します。しかし、何も考えずに処理を実装すると、メモリ不足や処理の遅延、データ整合性の問題が発生する可能性があります。実際の業務でもそうでした。
背景
多くのRailsアプリケーションはデータ量が増えるにつれて、処理速度やリソースの問題に直面します。例えば、以下のような課題が挙げられます。
- each でレコードを1件ずつ処理すると、メモリ使用量が増大する。
- 一括インサートしないとデータの登録処理が遅くなる。
- シングルスレッドで処理すると、バッチ処理が長時間かかる。
- 途中でエラーが発生した際のリカバリーが難しい。
こうした課題を解決するために、適切なバッチ処理の設計が必要になります。本記事では、数百万件のデータを効率的に処理するための手法を解説します。
前提
- レコード数:100万件程度
- カラム数:5〜10個程度
- 文字列、整数、日付などをバランスよく含む
- process(record) はrecord の id や name を取得する程度の比較的軽い処理
上記のようなデータを想定しております。
バッチ処理手法
1. ActiveRecord の find_each vs each の使い分けeach の問題点
Model.all.each do |record|
process(record)
endこの方法では、全レコードをメモリにロードしてしまうため、大量データを扱うとメモリ不足に陥る可能性があります。
find_each の活用
Model.find_each(batch_size: 1000) do |record|
process(record)
endfind_each を使うことで、データをバッチ単位で取得し、メモリの使用量を抑えながら処理を進めることができます。
each vs find_each のメモリ使用量の可視化
メモリ使用量を memory_profiler で比較してみます。
require 'memory_profiler'
report = MemoryProfiler.report do
Model.all.each { |record| process(record) }
end
report.pretty_printreport = MemoryProfiler.report do
Model.find_each(batch_size: 1000) { |record| process(record) }
end
report.pretty_print結果
each は全データを一度にメモリにロードするため、find_each に比べて約10倍のメモリを消費 していました。
2. バルクインサートを活用する
ActiveRecord の insert_all を利用すると、大量データのインサートを高速化できます。
…
記事の続きは下のURLをクリック!
https://rightcode.co.jp/blogs/51477
エンジニア積極採用中です!
現在、WEBエンジニア、モバイルエンジニア、デザイナー、営業などを積極採用中です!
採用ページはこちら:https://rightcode.co.jp/recruit
社員の声や社風などを知りたい方はこちら:https://rightcode.co.jp/blogs?category=life
社長と一杯飲みながらお話しませんか?(転職者向け)
特設ページはこちら: https://rightcode.co.jp/gohan-sake-president-talk
もっとワクワクしたいあなたへ
現在、ライトコードでは「WEBエンジニア」「モバイルエンジニア」「ゲームエンジニア」、「デザイナー」「WEBディレクター」「営業」などを積極採用中です!
ライトコードは技術力に定評のある受託開発をメインにしているIT企業です。
有名WEBサービスやアプリの受託開発などの企画、開発案件が目白押しの状況です。
- もっと大きなことに挑戦したい!
- エンジニアとしてもっと成長したい!
- モダンな技術に触れたい!
現状に満足していない方は、まずは、エンジニアとしても第一線を走り続ける弊社代表と気軽にお話してみませんか?
ネット上では、ちょっとユルそうな会社に感じると思いますが(笑)、
実は技術力に定評があり、沢山の実績を残している会社ということをお伝えしたいと思っております。
- ライトコードの魅力を知っていただきたい!
- 社風や文化なども知っていただきたい!
- 技術に対して熱意のある方に入社していただきたい!
一度、【Wantedly内の弊社ページ】や【コーポレートサイト】をのぞいてみてください。