0

非常に大きなCSVファイルがあります。約800,000行です。スクリプトを高速化するために、このファイルを並列で処理しようと思います。

Rubyを使用してファイルをn個の小さな断片に分割するにはどうすればよいですか?

4

3 に答える 3

2

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を使用できます。

于 2012-04-05T03:28:00.573 に答える
2

CSVファイルをチャンクに分割するのは適切ですが、各チャンクはCSVヘッダーの最初の行を保持する必要があることに注意する必要があります。

したがって、UNIXの「分割」はそれをカットしません!

最初の行を読み取って変数に格納し、次のN行を新しい部分CSVファイルに配布する独自の小さなRubyスクリプトを作成する必要がありますが、最初にCSVヘッダー行をそのファイルにコピーします。等..

ヘッダーと行のチャンクを使用して各ファイルを作成した後、Resqueを使用して、Resqueワーカーによる並列処理のためにそれらのファイルを参加させることができます。

http://railscasts.com/episodes/271-resque

于 2012-04-05T06:15:03.313 に答える
0

linux splitコマンドを使用して、このファイルを多くの小さなファイルに分割します。次に、これらの小さな部品を処理します。

于 2012-04-05T03:21:10.943 に答える