4

40 GB の大きなバイナリ ファイルをトラバースする必要があるプログラムを作成していますが、物理 RAM が 16 GB しかありません。友人は、ファイル マッピングを使用してこの問題を軽減できると教えてくれました。ファイル マッピングを作成してファイル マップ ハンドルに読み込む方法と、ファイル マッピングが永続メモリ内のファイルの一部を読み取り用の仮想メモリの異なるチャンクにマップする方法を理解しています。

したがって、これを正しく理解していれば、たとえば 10 GB のバッファーを作成し、ファイルの最初の 10 GB をこのバッファーに読み込むことができます。しかし、ファイルの 10 GB マークを超えて読み取る必要がある場合、OS は別のブロックを自動的に取得するのでしょうか、それともコードで手動で取得する必要がありますか?

4

1 に答える 1

5

リンクした関数は、ファイル マッピングに (直接) 関連していません。通常のファイル I/O に使用されます。

非常に大きなファイルで従来のファイル I/O を使用するには、説明したように行うことができます。ファイルを開き、バッファを作成し、ファイルのチャンクをバッファに読み込みます。ファイルの別の部分にアクセスする必要がある場合は、別のチャンクをバッファーに読み込みます。

ファイル マッピングを使用するには、CreateFile、CreateFileMappingMapViewOfFileの順に使用します。バッファーを (直接) 作成して、ファイルの一部をそこに読み込むことはありません。代わりに、メモリ アドレスの範囲であるかのように、ファイルの範囲にアクセスすることをシステムに伝えます。これらのアドレスへの読み取りと書き込みは、バックグラウンドでファイル I/O 操作に変換されます。このアプローチでは、チャンクで作業する必要がある場合があります。アクセスする必要があるファイルの部分が、現在マップしている範囲内にない場合は、別のビューを作成できます (場合によっては、別のビューを閉じます)。

ただし、 RAMとは異なるアドレス空間と言ったことに注意してください。64 ビット Windows 用にビルドしている場合は、40 GB のファイル全体をアドレス空間にマップすることを試みることができます。RAM が 16 GB しかないという事実は、あなたを止めることはありません。そのサイズでは他の問題が発生する可能性がありますが、RAM が原因ではありません。他の問題がある場合は、以前のようにファイルをチャンクで管理することに戻ります。

于 2015-07-10T20:38:06.473 に答える