Sequel4.1.0とmysql2でstream
Sequel4.1.0からmysql2クライアントのstreaming機能を使えるようになったらしい。
テーブルからでっかい行数を取得しようとするときに、
一気に取ってきてメモリに展開するのではなく
ちょっとずつ取ってきて、メモリを節約できる。
例えば1行ずつループさせて、必要なら途中で打ち切ったりもできるみたい。
require "sequel" DB = Sequel.connect("mysql2://user:password@hostname/database") class User < Sequel::Model(DB[:users]) end User.where({ :gender => "male" }).each do |user| # 性別が男のレコードをすべてメモリ上に展開してからループ end User.where({ :gender => "male" }).stream.each do |user| # たとえ意図せず巨大なレコード取得になったとしても # オンデマンドにデータを取得するので、 # 上の場合よりメモリ消費が少ない end
200万レコードくらいで試したら、
streamつけた方がeachがまわりきるのが1秒くらい早かったし(約5秒と約6秒)
メモリも少なかった。(約17MBと約27MB)