10

大量のデータ (GB 単位) を処理する必要があるアプリケーションに取り組んでいます。いつでも一度にすべてのデータが必要なわけではありません。データをセクション化し、特定のインスタンスのセクションでのみ作業する (したがって、メモリに取り込む) ことは問題ありません。

大量のデータを操作する必要があるほとんどのアプリケーションは、通常、メモリ マップされたファイルを使用して操作していると読んだことがあります。メモリ マップド ファイルについてさらに読むと、メモリ マップド ファイルからのデータの読み取り/メモリ マップド ファイルへのデータの書き込みが通常のファイル IO よりも高速であることがわかりました。

私が持っているクエリは次のとおりです。

  1. ファイル IO にメモリ マップド ファイル (boost::file_mapping を使用する予定で、Windows で作業中) を使用することと、ファイル ストリームを使用することの違いは何ですか?
  2. ファイル ストリームを使用する場合 (従来のハード ディスク 7200 rpm) と比較して、メモリ マップ ファイルの場合、データの読み取り/書き込みはどれくらい高速になると期待できますか?
  3. このような膨大な量のデータを処理するには、メモリ マップ ファイルが唯一の方法ですか? これを行うより良い方法はありますか(私のユースケースを考慮して)?
4

4 に答える 4

8

(免責事項: 私は提案された Boost.AFIOの作成者です)

ファイル IO にメモリ マップド ファイル (boost::file_mapping を使用する予定で、Windows で作業中) を使用することと、ファイル ストリームを使用することの違いは何ですか?

非常に単純化された答え:

メモリ マップされたファイルは、4Kb のチャンクを遅延して読み込みます。つまり、その 4Kb ページに最初にアクセスしたときです。データを要求すると、ファイル ストリームが読み取りを行います。

より正確な答え:

メモリ マップ ファイルを使用すると、ファイル I/O 用のカーネル ページ キャッシュに直接アクセスできます。開いているファイルに対してカーネルがキャッシュに保持しているものを正確に確認できます。読み取りと書き込みは、カーネル ページ キャッシュに直接行われます。バッファリングされた I/O では高速化できません。

ファイル ストリームを使用する場合 (従来のハード ディスク 7200 rpm) と比較して、メモリ マップ ファイルの場合、データの読み取り/書き込みはどれくらい高速になると期待できますか?

おそらく目立たない。違いをベンチマークする場合、キャッシュ アルゴリズムの違いなどの交絡因子である可能性があります。ハードドライブは非常に遅いため、常に支配的な要因になります。

システムの負荷の観点から 2 つのファイルの効率を比較する場合、メモリマップトファイルの方がはるかに効率的である可能性があります。STL iostreams はメモリを少なくとも 1 回コピーします。Windows では、ほとんどの「即時」I/O は実際にはプロセス用に Windows カーネルによって構成された小さな内部メモリ マップからの memcpy であるため、読み取ったすべてのものの 2 つのメモリ コピーになります。

すべての中で最も効率的なのは、常に O_DIRECT/FILE_FLAG_NO_BUFFERING であり、付属のすべての問題がありますが、オペレーティング システムよりもはるかに優れたキャッシュ アルゴリズムを作成することは非常にまれです。結局のところ、彼らは数十年かけてアルゴリズムを調整してきました。

このような膨大な量のデータを処理するには、メモリ マップ ファイルが唯一の方法ですか? これを行うより良い方法はありますか(私のユースケースを考慮して)?

メモリ マップ ファイルを使用すると、システム内のすべての空きメモリを利用する汎用キャッシュ アルゴリズムを使用して、カーネルが非常に大きなデータセットをキャッシュできます。一般的に言えば、ほとんどのユースケースでは、独自のアルゴリズムでそれらを打ち負かすことはありません.

于 2015-11-24T14:06:34.277 に答える
2

ファイル IO にメモリ マップド ファイル (boost::file_mapping を使用する予定で、Windows で作業中) を使用することと、ファイル ストリームを使用することの違いは何ですか?

とても違います。メモリ マップド ファイルを使用する場合は、メモリのようにファイルにアクセスするだけです。ファイルの明示的なロードまたは保存はありません。

これにより、アプリケーションとデータ ストレージに要件が課されます。この方法でデータにアクセスできることを確認する必要があります。また、アドレス指定可能なメモリにデータを収めることができることも確認する必要があります。32 ビット システムでは、数 Gb のデータに制限されます。

ファイル ストリームを使用する場合 (従来のハード ディスク 7200 rpm) と比較して、メモリ マップ ファイルの場合、データの読み取り/書き込みはどれくらい高速になると期待できますか?

それを期待しないでください。ポインタのページが整列されている場合、ほぼ同じパフォーマンスになる可能性があります。また、データを読み込んで物理 RAM に収まらない場合は、メモリをファイルにマップしている場合と同様に、スワップ アウトされることに注意してください。

このような膨大な量のデータを処理するには、メモリ マップ ファイルが唯一の方法ですか? これを行うより良い方法はありますか(私のユースケースを考慮して)?

それはあなたの実際のケースが何であるかによって異なります。

于 2015-11-23T14:52:51.883 に答える
-1

1

基本的に、メモリにマップされたファイルは、ハードディスクからメモリに移動された単なるブロックです。したがって、作成したブロックのサイズに関係なくコピーするだけで、そのブロックの操作は、ハードディスクの速度と比較して、メモリの速度と同じくらい高速です。

2

基本的に、メモリ速度とハードディスク速度の違いについて述べたように。

3

ビッグデータの経験があまりないので、これに答える資格はないと思います.

于 2015-11-23T14:45:52.997 に答える