非常に大きなCSVファイルがあります。約800,000行です。スクリプトを高速化するために、このファイルを並列で処理しようと思います。
Rubyを使用してファイルをn個の小さな断片に分割するにはどうすればよいですか?
非常に大きなCSVファイルがあります。約800,000行です。スクリプトを高速化するために、このファイルを並列で処理しようと思います。
Rubyを使用してファイルをn個の小さな断片に分割するにはどうすればよいですか?
csvファイルの場合、これを行うことができます。
open("your_file.csv").each_line do |line|
# do your stuff here like split lines
line.split(",")
# or store them in an array
some_array << line
# or write them back to a file
some_file_handler << line
end
行(または分割行)を配列(メモリ)またはファイルに格納することにより、大きなファイルを小さな断片に分割できます。その後、スレッドを使用して各ピースを処理できます。
threads = []
1.upto(5) { |i| threads << Thread.new { do your stuff with file[i] } }
threads.each(&:join)
スレッドを安全に保つ責任があることに注意してください。
お役に立てれば!
アップデート:
pguardiarioのアドバイスによると、ファイルを直接開く代わりに、スタンドライブラリのcsvを使用できます。
CSVファイルをチャンクに分割するのは適切ですが、各チャンクはCSVヘッダーの最初の行を保持する必要があることに注意する必要があります。
したがって、UNIXの「分割」はそれをカットしません!
最初の行を読み取って変数に格納し、次のN行を新しい部分CSVファイルに配布する独自の小さなRubyスクリプトを作成する必要がありますが、最初にCSVヘッダー行をそのファイルにコピーします。等..
ヘッダーと行のチャンクを使用して各ファイルを作成した後、Resqueを使用して、Resqueワーカーによる並列処理のためにそれらのファイルを参加させることができます。
linux splitコマンドを使用して、このファイルを多くの小さなファイルに分割します。次に、これらの小さな部品を処理します。