巨大なデータファイルの数行に一行がほしいということがあります。
たとえば、1分おきに記録されている元データがあるけど、実際には1時間に一回のデータが見られればいいという場合、60行につき1行のデータがとれれば事足りるという具合です。
result = "" idx = 0 File.open('./src.csv', 'r') do |f| f.each_slice(10000) do |chunk| result += chunk[0].to_s puts idx #check progress idx += 1 end end File.open("./output.csv", 'w') do |f| f.puts result end
肝は io.each_slice(n)メソッドを使うことです。
もともとのsrc.csvは1億2千万行を保持するファイルですが、each_slice(10000)を使うことによって、1万件のデータをひとかたまり(chunk)として取り出し、その1行目をresultに追記していくことで1万行につき一行を取り出すということをやっています。
この方法だと、メモリの使用量も全行を読み出すのに比べてずいぶん節約できているようでした。
スクリプトを回して10秒ちょっとくらいで無事、1万2千件のデータがoutput.csvに保存されました。
コメントを残す