質問: テキストファイルがあり,それの編集,例えば文字列置換をしたいとします.具体的に * 6 を 9 にすべて置換したい `sed` でも `vim -c '%s/6/9/g' -c ':wq' origfile` でもできるでしょうが,実際の処理はもう少し複雑で,~~`sed` は turing complete とはいえ~~ たとえば Python で処理全体を書きたいです.[回答は Python 以外の言語についてでも大丈夫です] この場合に,(元の文字列)→(処理後の文字列)の変換は問題なく書けますが,その結果をファイルに反映する処理をどうするのがよいのか迷っています.「一行ごと(でも何でも)元のファイルを読み込み,処理後の文字列を全部一時ファイルに書き込み,`mv tempfile original`」というのが唯一思いつく(そしてきちんと動く)方法なのですが,必ずファイルを全コピー相当になってしまうのが無駄が多いような気もしてしまいます.ごくごく直観的,そしてナイーブには変更のあったところだけ書き込みたい(原理的に無理な気がしてきていますが).底まで行かずともなにかうまい方法はありませんか,それともこれで正しいやり方なのでしょうか.
回答: 別口でインデックスファイルをつくってよければ、元のファイルを一旦読み込んで索引をつくり、編集内容はアペンドするだけにして、インデックスを更新するということやればいいわけです。こうすると高速に読み書き可能です。編集差分やインデックスが大きくなってきたらガベージコレクトします。 同じテクニックはPostgresqlのようなデータベース, MS-Office(95の時代から), CD-ROMのファイルを仮想的に読み書きする仕組み、などなどで使われています。