googleしてもそれらしいことをやっている暇な人はいないらしい。
案1 CreateFile して ReadFile
普通、当然ディスクIOをもろにうけるため、ReadFileで大量に待たされる。
案2 CreateFile して ReadFile で OVERLAPPED する
読み込んでいる最中に別の処理が出来るので便利だが、、プログラムが複雑化するのが最大の問題点。
次に、読み込んでいる間の別の処理ってやつがファイルを読み込む時間より短い場合、、、結局、ファイル読み込みに足を引っ張られるので意味がない!!
一般的にディスクIOって低速だからねぇ、意味なさ杉。
だから、OVERLAPPEDなんて誰も使わないわけね、納得。ガッテンガッテン。
案3 CreateFileMapping / MapViewOfFile (mmap)してしまう。
読み込みは一瞬で終わる、最速。
しかし、読み込んだファイルのデータを弄っている最中に案1,案2でかからなかったウェイトがかかる。
ページフォルト? それとも、 CreateFileMappingってデータを遅延して読み込んでいるのかな? データが使われる瞬間にデータを読み込んでいるのかも??
理由はよくわからないが、読み込んだ内容にアクセスすると遅くなるので案1,案2とかわらない。
さて、どうしたものか、、、
残る選択肢は、
案4 ページフォルトが起きないように VirtualAllocで確保してMapViewOfFileExする
今やっているんだけど、MapViewOfFileExってすごくクセがある関数だなぁ、、最後のメモリを渡す所、
呼び出し側プロセスのアドレス空間でマッピングを開始するメモリアドレスへのポインタを指定します。この値は、システムのメモリ割り当ての単位の倍数でなければなりません。それ以外の値を指定すると、関数は失敗します。システムのメモリ割り当ての単位を取得するには、SYSTEM_INFO 構造体のメンバを記述する GetSystemInfo 関数を使います。指定されたアドレスに十分なアドレス空間がないと、関数は失敗します。
MSDN MapViewOfFileEx より引用
大量にファイルを読み込む場合、、VirtualAllocって低速だから、はじめに大量にメモリを確保して、少しづつ切り分けするルーチンも必要だよね。自分で Heapを実装する必要があるのか、、、
って、感じで挫折しそう。
結局、ソフトウェア的にはアキラメロってのが正解でFAでつか?

