2010-12-14 16 views
4

Rubyでは、巨大なテキストファイルを読み込むのに最も効率的な方法は何ですか? 10 の順で、89バイト/行。 1つの方法は他の方法よりも著しく優れていますか?Rubyで最も効率的な入力方法

+0

は、あなたがラインごと、あるいはどのように処理されるように意味ですか? – tokland

+0

はい、行ごと – mbm

答えて

4

テキストファイルを読み込むための良い方法を知るために、少し前にベンチマークを行いました。最も速いのは、テキストブロックで読み込み、String.linesを使用してそれらを反復処理することでした。

IO.foreach(ARGV.shift) do |li| 
    print li 
end 

time ruby test.rb root.mbox > /dev/null 
# 
# real 0m3.949s 
# user 0m3.709s 
# sys  0m0.182s 

私はタイミングの画面I/Oを削除するには/ dev/nullにそれをダンプ:

ベースラインとして188593869バイトでテキストファイルを読み込みます。代わりに、ライン・バイ・ライン専用の読書の

、行を反復処理し、その後、大きな塊でそれをロードします。

File.read(ARGV.shift).lines do |l| 
    print l 
end 

time ruby test.rb root.mbox > /dev/null 

real 0m3.492s 
user 0m3.281s 
sys  0m0.209s 

0.5秒の節約です。また、188MBのデータを吸ってしまいました。ファイルが大きいとうまく調整できません。良いことは、私がしたファイル全体を、read()を使ってロードするか、読み込みサイズを制限するように伝えることです。

ここではあなたの参照のためのテキストファイルのwcからクリーンアップの出力です:

lines: 2,465,369 
words: 26,466,463 
bytes: 188,593,869 
+0

Windows上の 'File.read'は[非常に遅いです](http://phrogz.net/slow-file-reads-on-windows-ruby-1.9)です。バイナリの読み込みモードを強制するために 'File.open( 'foo'、 'rb'、&read)を使うのが良いでしょう(しかし' \ r \ n 'のペアを適切に処理する必要があります)。 – Phrogz

関連する問題