2017-03-02 11 views
3

私は6GBのテキストファイルを持っています。私は次のようなことをしたい:Rubyで大きな文字列を効率的に反復して更新するには?

str.gsub!('xxx', 'x') 

アイデアは、シークを使用して1MBのチャンクを読み取ることでした。上記の置換をより効率的に行う方法はありますか?おそらくCのような配列アクセスを使用して文字列を反復?巨大なファイルは、言う20行以上のものを持っている場合

+1

それはラインを持っていますか?ファイルを書き戻しますか? –

+1

一つのオプションは 'mmap'を使っています(残念なことに、これには第三者の宝石が必要です)。あなたがチャンクを使うことにした場合、境界にまたがるパターンを扱う必要があることを覚えておいてください。つまり、2つの最初の 'x 'が最初のチャンクの最後にあり、3番目の' x'が後続のチャンク –

+1

'' xxxx'.sub( 'xxx'、 'x')#=> = '' xx''ですか? –

答えて

2

、あなたが使用できます。

File.open('new_file', 'w') do |out| 
    File.foreach('huge_file.txt') do |line| 
    out.puts line.gsub('xxx', 'x') 
    end 
end 

これは非常に低いメモリフットプリントを持っていますし、合理的に高速である必要があります。あなたは非常に高速になりますsedを使用して、子プロセスでそれを行うことができます

+0

6GBファイルに2行がある場合はどうなりますか? :-) –

+0

@CarySwoveland:True。更新しました。 –

+1

@EricDuminilファイルには何百万もの行があります。 –

3

`sed -i -E 's:xxx:x:g' file_name` 
+0

Rubyの行単位の読み込みは高速ですが、これはsedがこの目的のために書かれているのでより高速です。 –

関連する問題