2007年02月27日

巨大なファイルの内容をメモリにすべてコピーする最速の方法って何よ

物理メモリ > 読み込むファイル の条件でファイルをメモリに読み込む場合で最速の方法って何だろう。

googleしてもそれらしいことをやっている暇な人はいないらしい。

案1 CreateFile して ReadFile


普通、当然ディスクIOをもろにうけるため、ReadFileで大量に待たされる。????????

案2 CreateFile して ReadFile で OVERLAPPED する


読み込んでいる最中に別の処理が出来るので便利だが、、プログラムが複雑化するのが最大の問題点。
次に、読み込んでいる間の別の処理ってやつがファイルを読み込む時間より短い場合、、、結局、ファイル読み込みに足を引っ張られるので意味がない!!
一般的にディスクIOって低速だからねぇ、意味なさ杉。????????
だから、OVERLAPPEDなんて誰も使わないわけね、納得。ガッテンガッテン。

案3 CreateFileMapping / MapViewOfFile (mmap)してしまう。


読み込みは一瞬で終わる、最速。
しかし、読み込んだファイルのデータを弄っている最中に案1,案2でかからなかったウェイトがかかる。?????????`?i?????????j
ページフォルト? それとも、 CreateFileMappingってデータを遅延して読み込んでいるのかな? データが使われる瞬間にデータを読み込んでいるのかも??
理由はよくわからないが、読み込んだ内容にアクセスすると遅くなるので案1,案2とかわらない。


さて、どうしたものか、、、
残る選択肢は、

案4 ページフォルトが起きないように VirtualAllocで確保してMapViewOfFileExする



今やっているんだけど、MapViewOfFileExってすごくクセがある関数だなぁ、、最後のメモリを渡す所、

呼び出し側プロセスのアドレス空間でマッピングを開始するメモリアドレスへのポインタを指定します。この値は、システムのメモリ割り当ての単位の倍数でなければなりません。それ以外の値を指定すると、関数は失敗します。システムのメモリ割り当ての単位を取得するには、SYSTEM_INFO 構造体のメンバを記述する GetSystemInfo 関数を使います。指定されたアドレスに十分なアドレス空間がないと、関数は失敗します。
MSDN MapViewOfFileEx より引用


大量にファイルを読み込む場合、、VirtualAllocって低速だから、はじめに大量にメモリを確保して、少しづつ切り分けするルーチンも必要だよね。自分で Heapを実装する必要があるのか、、、?????????`?i?????????j

って、感じで挫折しそう。????????


結局、ソフトウェア的にはアキラメロってのが正解でFAでつか?
posted by rti at 03:37 | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/34776685

この記事へのトラックバック