Techioz Blog

Ruby - ファイルをバッチで読み取る

概要

サイズが 10MB で、いくつかの ID が含まれるファイルを読んでいます。それらを Ruby でリストに読み込みます。将来、ファイル内の ID の数が増加したときにメモリの問題が発生するのではないかと心配しています。大きなファイルをバッチで読み取る効果的な方法はありますか?

ありがとう

解決策

Lazy Enumerator と each_slice を使用すると、両方の長所を活用できます。行を途中で切ることを心配する必要はなく、バッチで複数の行を繰り返すことができます。バッチサイズは自由に選択できます。

header_lines = 1
batch_size   = 2000

File.open("big_file") do |file|
  file.lazy.drop(header_lines).each_slice(batch_size) do |lines|
    # do something with batch of lines
  end
end

巨大な CSV ファイルをデータベースにインポートするために使用できます。

require 'csv'
batch_size   = 2000

File.open("big_data.csv") do |file|
  headers = file.first
  file.lazy.each_slice(batch_size) do |lines|
    csv_rows = CSV.parse(lines.join, headers: headers)
    # do something with 2000 csv rows, e.g. bulk insert them into a database
  end
end