6

私は小さな問題に取り組んでおり、それを解決する方法についてアドバイスがあります。列と行の数が不明なcsvファイルが与えられた場合、値と各値が繰り返された回数を含む列のリストを出力します。ライブラリを使用せずに。

ファイルが小さい場合、これは問題にはなりませんが、数ギグの場合、NoMemoryError:メモリの割り当てに失敗します。ファイルをメモリにロードする代わりに、ハッシュを作成してディスクから読み取る方法はありますか?あなたは結ばれたハッシュでperlでそれをすることができます

編集:IO#foreachはファイルをメモリにロードしますか?File.open(filename).eachはどうですか?

4

3 に答える 3

21

一度に 1 行ずつファイルを読み取り、各行を破棄します。

open("big.csv") do |csv|
  csv.each_line do |line|
    values = line.split(",")
    # process the values
  end
end

この方法を使用すると、メモリが不足することはありません。

于 2012-12-12T22:46:31.133 に答える
6

一度にファイル全体を読み取りますか? 行ごとに読み取る、つまりruby -peruby -neまたは$stdin.eachを使用すると、処理された行のガベージ コレクションによってメモリ使用量が削減されます。

data = {}
$stdin.each do |line|
  # Process line, store results in the data hash.
end

名前を付けて保存しscript.rb、巨大な CSV ファイルをこのスクリプトの標準入力にパイプします。

ruby script.rb < data.csv

標準入力から読みたくない場合は、少し変更する必要があります。

data = {}
File.open("data.csv").each do |line|
  # Process line, store results in the data hash.
end
于 2012-12-12T22:22:35.287 に答える