2016-08-19 10 views
0

のは、私は1つに、いくつかの大規模なファイルを結合したいとしましょう、その後uniq! 1(THATのみホット秒かかる場合があります)大きなテキストファイルを行単位で読み込み、このストリームをRubyの行単位でファイルに追加する方法は?

それは私の理解だというFile.readlines()メモリにロードし、すべての行。どのようにnode.js pipe()システムのように、行ごとにそれを読む方法がありますか?

+0

あなたは間違いなく1行ずつ(一度に1Mbと言うのではなく)1行ずつやりたいですか? –

答えて

2

一つは、ブロック内のファイルIOを行うことができるということです。

File.open("test.txt", "r").each_line do |row| 
    puts row 
end    # file closed here 

ので、物事は自動的にクリーンアップを取得します。たぶん小さなスクリプトでは問題にならないかもしれませんが、あなたが無料で入手できることを知っているのは常に素晴らしいことです。

2

あなたは一度にファイルの内容全体を操作しているわけではありません。また、readlineを使用する場合は、各行の全体を保存する必要はありません。ルビーの優れた点の

file = File.open("sample.txt", 'r') 
while !file.eof? 
    line = file.readline 
    puts line 
end 
+0

これが当てはまる場合、350Mbファイルに "readlines"をロードするのに5秒かかるのはなぜですか?私はちょうどそれが配列を "プリロード"していると仮定しました –

+0

ええ、私は同じ問題を抱えていましたが、readlineは多くの時間を節約しました。これがうまくいくなら、答えを受け入れてください。 –

0

大きなファイルは、他の回答に示されているようにeach_lineのようなストリーミング方法、またはファイルを開き、1行ずつ読むforeachで最もよく読み込まれます。したがって、プロセスがメモリ内のファイル全体を要求しない場合は、ストリーミング方法を使用する必要があります。ストリーミングを使用している間に、ファイルサイズがreadlinesのような非ストリーミング方法に反して増加しても、必要なメモリは増加しません。

File.foreach("name.txt") { |line| puts line }

1

uniq!Array上で定義されているので、あなたは、とにかくArrayにファイルを読み込む必要があります。ファイルを処理したくない、処理したいファイルが、Arrayが厳密なインメモリデータ構造であるため、ファイルを1行ずつ処理することはできません。

関連する問題