Win32メモリマッピングファイルとCRT FOPEN/FREADのパフォーマンス
-
09-10-2019 - |
質問
ファイルを順番に読み取り(スキャン)(スキャン)、コンテンツを処理する必要があります。ファイルサイズは、非常に小(一部のKB)から非常に大きい(一部のGB)までのものです。
Windows 7 64ビットでVC10/VS2010を使用して2つのテクニックを試しました。
- win32メモリマッピングファイル(つまり、createfile、createfilemapping、mapviewoffileなど)
- CRTからFOPENとFREAD。
メモリマッピングされたファイル手法はCRT関数よりも高速である可能性があると思いましたが、一部のテストでは、どちらの場合も速度がほぼ同じであることが示されました。
次のC ++ステートメントはMMFに使用されます。
HANDLE hFile = CreateFile(
filename,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN,
NULL
);
HANDLE hFileMapping = CreateFileMapping(
hFile,
NULL,
PAGE_READONLY,
0,
0,
NULL
);
ファイルは順番に読み取られ、チャンクによってチャンクされています。各チャンクはです SYSTEM_INFO.dwAllocationGranularity
サイズ。
MMFとCRTで速度がほぼ同じであることを考慮すると、CRT関数はよりシンプルでマルチプラットフォームであるため、CRT関数を使用します。しかし、私は興味があります:私はMMFテクニックを正しく使用していますか? Scannigファイルのこの場合のMMFパフォーマンスがCRT Oneと同じであることは普通ですか?
ありがとう。
解決
ファイルに順番にアクセスしても、あまり違いがないと思います。ファイルI/Oは非常に重くキャッシュされているため、 + read-Aheadもおそらく使用されます。
ファイルデータ処理中に多くの「ジャンプ」があった場合、問題は異なります。その後、新しいファイルポインターを設定して新しいファイル部分を読み取るたびにCRTが殺されるのに対し、MMFは最大限のパフォーマンスを提供します
他のヒント
ファイルを順番にスキャンしているので、どちらの方法でもディスク使用パターンが大きく異なるとは思わないでしょう。
大きなファイルの場合、MMFはデータの局所性を減らし、ファイルのすべてまたは一部のコピーがPageFileに配置されますが、小さなバッファーを使用したCRTを介した処理はすべてRAMで行われます。この例では、MMFはおそらく遅くなるでしょう。一度に基礎となるファイルの一部でのみマッピングすることでこれを軽減できますが、直接的なシーケンシャルI/Oに勝つことなく、物事はより複雑になります。
MMFは、一般化されたファイルI/Oをスピードアップする方法ではなく、Windowsがインタープロセス共有メモリを実装する方法です。カーネルのファイルマネージャーキャッシュは、ここで活用する必要があるものです。
メモリマッピングされたファイル手法はCRT関数よりも高速である可能性があると思いましたが、一部のテストでは、どちらの場合も速度がほぼ同じであることが示されました。
おそらく、テストのためにファイルシステムキャッシュを押しているでしょう。ファイルシステムのキャッシュをバイパスするためにファイルハンドルを明示的に作成しない限り(FILE_FLAG_NO_BUFFERING
電話するとき CreateFile
)、ファイルシステムキャッシュがキックインし、最近アクセスされたファイルをメモリに保持します。
オペレーティングシステムが追加のコピーを実行する必要があるため、ファイルシステムキャッシュがオンになっているファイルシステムキャッシュにあるファイルを読み取ることと、システムコールオーバーヘッドを読み取ることには、わずかな速度の違いがあります。しかし、あなたの目的のために、おそらくCRTファイル関数に固執する必要があります。
Gustavo Duarteには、メモリマップされたファイルに関する素晴らしい記事があります (一般的なOSの観点から)。
どちらの方法も最終的にディスクI/Oになります。これはあなたのボトルネックになります。私は私の高レベルの機能がもっと好きな1つの方法を使用します。ストリーミングが必要な場合は、ファイルを使用します。シーケンシャルアクセスと固定サイズファイルが必要な場合は、メモリマッピングファイルを検討します。
または、メモリでのみ動作するアルゴリズムがある場合、Mem-Mappedファイルは簡単に登場する可能性があります。