私は6GBのテキストファイルを持っています。私は次のようなことをしたい:Rubyで大きな文字列を効率的に反復して更新するには?
str.gsub!('xxx', 'x')
アイデアは、シークを使用して1MBのチャンクを読み取ることでした。上記の置換をより効率的に行う方法はありますか?おそらくCのような配列アクセスを使用して文字列を反復?巨大なファイルは、言う20行以上のものを持っている場合
私は6GBのテキストファイルを持っています。私は次のようなことをしたい:Rubyで大きな文字列を効率的に反復して更新するには?
str.gsub!('xxx', 'x')
アイデアは、シークを使用して1MBのチャンクを読み取ることでした。上記の置換をより効率的に行う方法はありますか?おそらくCのような配列アクセスを使用して文字列を反復?巨大なファイルは、言う20行以上のものを持っている場合
、あなたが使用できます。
File.open('new_file', 'w') do |out|
File.foreach('huge_file.txt') do |line|
out.puts line.gsub('xxx', 'x')
end
end
これは非常に低いメモリフットプリントを持っていますし、合理的に高速である必要があります。あなたは非常に高速になりますsed
を使用して、子プロセスでそれを行うことができます
6GBファイルに2行がある場合はどうなりますか? :-) –
@CarySwoveland:True。更新しました。 –
@EricDuminilファイルには何百万もの行があります。 –
:
`sed -i -E 's:xxx:x:g' file_name`
Rubyの行単位の読み込みは高速ですが、これはsedがこの目的のために書かれているのでより高速です。 –
それはラインを持っていますか?ファイルを書き戻しますか? –
一つのオプションは 'mmap'を使っています(残念なことに、これには第三者の宝石が必要です)。あなたがチャンクを使うことにした場合、境界にまたがるパターンを扱う必要があることを覚えておいてください。つまり、2つの最初の 'x 'が最初のチャンクの最後にあり、3番目の' x'が後続のチャンク –
'' xxxx'.sub( 'xxx'、 'x')#=> = '' xx''ですか? –