Sequel4.1.0とmysql2でstream

Sequel4.1.0からmysql2クライアントのstreaming機能を使えるようになったらしい。
http://sequel.rubyforge.org/rdoc/files/doc/release_notes/4_1_0_txt.html


テーブルからでっかい行数を取得しようとするときに、
一気に取ってきてメモリに展開するのではなく
ちょっとずつ取ってきて、メモリを節約できる。
例えば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)