11

C ++でファイルをメモリに読み込むために使用される、一般的に受け入れられている最速の手法はありますか?

私はファイルを読むだけです。

ブーストに実装があるのを見てきました。ここで他のいくつかの実装を見てきましたが、最速と見なされるものを知りたいですか?

前もって感謝します

念のため、最大 1 GB のファイルを検討しています。これは Windows 用です。

4

4 に答える 4

6

メモリマップトファイルを使用します。移植性のためにブーストラッパーを使用する場合もあります。

仮想アドレス空間の空きの連続した部分よりも大きいファイルを読み取りたい場合は、ファイルのマップされた部分を自由に移動できます。

于 2012-05-31T15:37:31.383 に答える
4

ファイルは最大1GBのサイズになる可能性があるため、ケースにはメモリマップトファイルの使用を検討してください。

そして、ここでwin32APIから始めることができます。

MSDNページには他にも役立つAPIがいくつかあります。

于 2012-05-31T15:37:03.483 に答える
2

メモリ マップト ファイルがアプリケーションに適しておらず、ファイル I/O がボトルネックである場合は、I/O 完了ポートを使用してファイルの非同期 I/O を処理することが Windows で最速になります。

I/O 完了ポートは、マルチプロセッサ システムで複数の非同期 I/O 要求を処理するための効率的なスレッド モデルを提供します。プロセスが I/O 完了ポートを作成すると、システムは、これらの要求を処理することのみを目的とする要求に関連するキュー オブジェクトを作成します。多くの同時非同期 I/O 要求を処理するプロセスは、I/O 要求の受信時にスレッドを作成するよりも、事前に割り当てられたスレッド プールと組み合わせて I/O 完了ポートを使用することにより、より迅速かつ効率的に処理できます。

于 2012-05-31T15:43:31.613 に答える
1

一般的に言って、mmapです。しかし、Windowsでは、これを行う独自の方法を発明しました。 「ファイルマッピング」を参照してください。Boostには、移植可能なコードの山の下で双方向をラップするメモリマップトファイルライブラリがあります。

また、高速にしたい場合は、ユースケースに合わせて最適化する必要があります。ファイルの内容をメモリにマッピングするだけでは不十分です。実際、メモリマップトファイルが不要である可能性があり、たとえば、非同期ファイルI/Oを使用したほうがよい場合があります。多くの問題には多くの解決策があります。

于 2012-05-31T15:39:32.693 に答える