巨大なファイルの編集

 バイナリエディタ開発関連のお話です([hex]カテゴリ)。さて、今回はファイルの編集と、巨大なファイル編集時のことについて。
http://www.catch22.net/tuts/bigmem01.asp
http://www.catch22.net/tuts/bigmem02.asp
 読まなくてもわかるように簡単に説明しますと、巨大な(数百メガ単位)の連続したデータ(ファイル)がありまして、そのデータを編集する際、数バイトのデータを削除するとなると、残りのデータを削除した部分を埋めるように移動する必要がでてくるため、パフォーマンス上のネックになります。これは、ひとつのバッファ(メモリ)でデータを管理しようとする場合に必要な処理です。小さなデータなら特に問題はなく、プログラムを作るのも比較的簡単です。そこで、データの挿入・削除後のデータを元のデータを操作することなく、プログラム上で仮想的にデータを表現する仕組みを作ることで、巨大なファイルの編集で、パフォーマンスの低下防ぐことが可能になるでしょう。ファイルマッピング実装してるバイナリエディタはこれが実装できてるはずですorz
 そして、パフォーマンス以外に問題になるは、Win32APIのMapViewOfFile関数です。この関数は、ファイルをメモリ上にマッピングすることができますが、32ビットアークテクチャ上でのポインタ型変数のサイズは32ビットです。4GBより大きな数を表現できません。また、いくら32ビットといっても、実行されるプログラムのメモリ空間が32ビットですから、32ビットで表現できるすべてのアドレスをファイルに割り当てることはできません。そこで、巨大なファイルの編集には複数回MapViewOfFileを実行する必要がでてきます。
 はぁ・・この、巨大なファイル編集のためのドキュメントクラスの作成が憂鬱です。こんな日記書く以前に、チュートリアルソースコード読むのが先決ですよねえ。