大容量ファイルI/Oの効率について

数百GiBクラス以上のボリュームのデータを処理してると極端にパフォーマンスが落ちちゃう問題だけど、原因の一つは、どうも大容量ファイルI/Oの場合にはファイルマッピングだと効率が悪いことにある模様(環境やその他の条件にもよるのかもしれないけど)。推測の域をでないけど、メモリアロケートを伴う MapViewOfFile()/MapViewOfFileEx(), UnmapViewOfFile() を繰り返し何度も呼び出すことで、致命的なメモリの断片化でも発生してるくさい。自前で用意したリングバッファ(ring_bufferクラス)に ReadFile() でデータを読み込むようにしたら 100GiB のファイルの読み込みで1割程度高速化できた。

あと別の原因では、数百GiBクラスのファイルになっちゃうと、ディスク上に記録されている位置の違いからか、フラグメントを起こして無くても単純に同じ量のアクセスでファイルの先頭と末尾で倍半以上の速度差が出ちゃうこと。最初は処理を進めていく上でなにかが弊害になって段々処理速度が落ちてんのかと思ったら、いきなりファイルの真ん中から読み込みを始めても、先頭から処理を始めて真ん中に到達した以後の速度と変わらねぇでやんの。これも推測の域をでないけど、ファイルアロケーションテーブルとファイルデータが格納されているディスク上の位置がファイルの後ろの方になるほど開きがでて、頻繁に激しいシークでも起きてんじゃなかろうかと思う。普通のサイズのファイルならそんなことはなかなかないかもしれないけど数百GiBクラスのファイルのアロケーション情報なんてなかなかキャッシュできるもんじゃないだろうしねぇ。(後続データが連続したブロックに記述されていることを示すフラグでもあれば別なんだろうけど。)