PerlerのRuby日記

Rubyとか

Sequel4.1.0とmysql2でstream

Sequel4.1.0からmysql2クライアントのstreaming機能を使えるようになったらしい。

4.1.0.txt


テーブルからでっかい行数を取得しようとするときに、

一気に取ってきてメモリに展開するのではなく

ちょっとずつ取ってきて、メモリを節約できる。

例えば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)