のは、私は1つに、いくつかの大規模なファイルを結合したいとしましょう、その後uniq!
1(THATのみホット秒かかる場合があります)大きなテキストファイルを行単位で読み込み、このストリームをRubyの行単位でファイルに追加する方法は?
それは私の理解だというFile.readlines()
メモリにロードし、すべての行。どのようにnode.js pipe()
システムのように、行ごとにそれを読む方法がありますか?
のは、私は1つに、いくつかの大規模なファイルを結合したいとしましょう、その後uniq!
1(THATのみホット秒かかる場合があります)大きなテキストファイルを行単位で読み込み、このストリームをRubyの行単位でファイルに追加する方法は?
それは私の理解だというFile.readlines()
メモリにロードし、すべての行。どのようにnode.js pipe()
システムのように、行ごとにそれを読む方法がありますか?
一つは、ブロック内のファイルIOを行うことができるということです。
File.open("test.txt", "r").each_line do |row|
puts row
end # file closed here
ので、物事は自動的にクリーンアップを取得します。たぶん小さなスクリプトでは問題にならないかもしれませんが、あなたが無料で入手できることを知っているのは常に素晴らしいことです。
あなたは一度にファイルの内容全体を操作しているわけではありません。また、readlineを使用する場合は、各行の全体を保存する必要はありません。ルビーの優れた点の
file = File.open("sample.txt", 'r')
while !file.eof?
line = file.readline
puts line
end
これが当てはまる場合、350Mbファイルに "readlines"をロードするのに5秒かかるのはなぜですか?私はちょうどそれが配列を "プリロード"していると仮定しました –
ええ、私は同じ問題を抱えていましたが、readlineは多くの時間を節約しました。これがうまくいくなら、答えを受け入れてください。 –
大きなファイルは、他の回答に示されているようにeach_line
のようなストリーミング方法、またはファイルを開き、1行ずつ読むforeach
で最もよく読み込まれます。したがって、プロセスがメモリ内のファイル全体を要求しない場合は、ストリーミング方法を使用する必要があります。ストリーミングを使用している間に、ファイルサイズがreadlines
のような非ストリーミング方法に反して増加しても、必要なメモリは増加しません。
File.foreach("name.txt") { |line| puts line }
あなたは間違いなく1行ずつ(一度に1Mbと言うのではなく)1行ずつやりたいですか? –