500万件とかRailsでバッチ処理は結構きつい

 Railsで、ユーザが500万件居たりすると User.find(:all) とかやっただけでかなりきつい。こういうのをやるときって、バッチ処理だと思うんだけど、結構工夫してループ内で何回も find したりしても、メモリ足りなくなったりするから、結局 script/runner で Rails の起動コストを引いても シェルスクリプト回したほうが安全っていう結論になる。

 50000件ずつループで処理して、Railsを再起動みたいな感じになる。

#!/bin/sh
limit=50000
count=50000
while [ $count -le 5000000 ];
do
  script/runner "User.find(:all, :offset => $count,  :limit => $limit, :conditions => ['migration_complete = false']).each(&:check_email)"
 
  echo "$count"
  count=`expr $count + 5000`
done
500万件とかRailsでバッチ処理は結構きつい