2017-06-08 15 views
0

ファイルを開いて読み込み、内容全体を置き換えて書き出して閉じますか?Ruby - ファイルの読み込み、内容の置き換え、終了

File.open('foo.bin', 'r') do |f| 
    contents = f.read 
end 
# do something with the contents 
File.open('foo.bin', 'w') do |f| 
    f.print contents 
end 

をしかしそこに2つのIOオープンステップと、その中に2つのIO近い段階があり、IOのステップを2倍にすると、ディスク上のはるかに困難はもちろんのこと、総廃棄物のように思える:

私はこれを行うことができます私のスクリプトで何度も起こりそうなことが何度もあります。

オープン方法、読み取り方法、上書き方法、終了方法はありますか?

+0

はちょうどそれを処理するために、データのすべての単一の部分を読み込むためにあなたを必要としない優れたデータ・フォーマットを使用することを検討してください。 SQLiteは常に良いスタートです。また、これが遅くなっていると判断する前にコードをプロファイリングしましたか? – Schwern

+0

私の頭の上にあるビジネス上の意思決定のために、私はそれを完全にローカルにして、外部の依存なしにどのマシンにも持ち運びできるようにしなければなりません。どのDBの可能性もほとんどなくなります。サイズは大きすぎてすべてをメモリに格納することはできません。それは私の唯一の選択肢としてIOを残し、私の質問が残っています。 – yenadar

+0

はい、これはいくつかの減速の1つです。私はこれを含め、それぞれに取り組んでいます。 – yenadar

答えて

3

まず、コードをプロファイルしていない場合は、今すぐ実行してください。余分なファイルのオープン/クローズは、あなたのスローダウンの原因になる可能性は低いです。プロファイリングは実際の問題がどこにあるかを示します。

私はこれがもっと速くなるとは確信していませんが、ここでは1回の開閉でこれを行う一般的な手順があります。

  1. 開封済み&書き込み。
  2. ファイル全体を読み込みます(行単位ではありません)。
  3. ファイルを切り捨てます。
  4. 先頭に戻る。
  5. を書きます。
  6. 閉じる。 Rubyで

、あなたはとても似ていることか:

# Open the file for read/write. 
File.open("test.data", "r+") { |f| 
    # Read the whole file 
    contents = f.read 

    # Truncate the file 
    f.truncate(0) 

    # Jump back to the beginning 
    f.rewind 

    # Write the new content 
    f.write("new stuff\n") 
} 
+0

何かを学んでいただきありがとうございます。 – yenadar

+0

は、少なくとも私のシステム(ルビー2.4、OS X)で、 'truncate'は、あなたが'それをrewind'が必要になる場合がありますので、あまりにも、位置を調整していないようです。 – Stefan

+0

@Stefanええ、私はそれが少し魚だったと思った。巻き戻しを追加します。ありがとうございます。巻き戻しなしではどうなりますか? – Schwern

関連する問題