2

バイナリ ファイルを直接 RAM に読み込む方法はありますか?

私が言いたいのは、コンパイラに伝える方法があるということです。ここにファイルがあり、ここに RAM のブロックがあります。ファイルの内容を RAM に置いてください。すぐに行ってください。

現在、ifstream を使用してファイルをステップ実行し、64 ビット ブロックごとに RAM (配列) にロードしています。しかし、これは、カップを持ち上げるだけでなく、指ぬきを使用してカップ (ファイル) から水差し (RAM) に水を汲み出すようなものであるため、速度が低下する必要があると考えています。内容物全体を一度に水差しに傾けます。

これに比較的慣れていない私は、これについて完全に間違った考えを持っている可能性があります。

大きなファイルをRAMに入れる最も簡単な方法を探しています。

ありがとう

4

8 に答える 8

11

1 回のパスでファイルを読み取れない理由は何ですか? 大きすぎてメモリに収まりませんか?

マッピングされたファイル、UNIX : mmap、Windows : CreateFileMapping も使用できます。

于 2009-07-06T09:50:33.043 に答える
6

必要なのはメモリ マップ ファイルだと思いますが、API は使用している OS によって異なります。UNIX では mmap() だと思います。

于 2009-07-06T09:50:39.017 に答える
2

どのプラットフォームを使用しているかはわかりませんが、これはメモリ マップト ファイルの仕事のように思えます。

于 2009-07-06T09:50:31.687 に答える
2

mmapあなたのために働くはずです。ほとんどの実装では、実際のメモリ ページを参照するまで実際にファイルを読み取ることはありませんが、いずれにせよ、常に RAM にあるかのようにファイルの内容にアクセスできます。

于 2009-07-06T09:50:20.487 に答える
0

DirectX SDK の ContentStreaming の例を見てください。

ファイル マッピング アプローチを使用します。もちろん、Windows API を使用していますが、他のプラットフォーム用の対応する API も見つけることができます。

興味深いのは、コンテキストでアプローチを示していることです。(巨大なモデル (この場合は地形) の一部をオンデマンドで読み込み/ページングする

于 2009-07-06T10:55:03.273 に答える
0

プログラムには仮想メモリが与えられます。その一部は RAM にマップされ、一部はスワップ ファイルにマップされますが、それについては多くのことを行うことはできません。ただし、より大きなブロック (たとえば数メガバイト) をコピーするだけで、ファイルシステム インターフェイスを使用するオーバーヘッドを減らすことができます。

于 2009-07-06T09:51:15.163 に答える
0

Boost は、とりわけ、メモリ マップされたファイルのクロス プラットフォーム サポートを提供します...

Boost Memory Mapped ファイル

于 2010-01-02T12:01:15.687 に答える
0

これがあなたの求めているものかどうかはわかりませんが、ファイルからの読み取りを高速化するには、より多くのバイトをバッファリングできます。fstream の read() メソッドの 2 番目の引数を設定して、入力サイズを指定できます。たとえば、32k (32*(2^10)) の値を指定すると、読み取りプロセスが高速化される可能性があります。異なるバッファサイズでベンチマークを行うことをお勧めします。

「ファイルをスワップに配置して常にRAMに配置することを避ける」ことを意味する場合、これはOSが処理するものであるため、できると思います。

于 2009-07-06T10:00:10.090 に答える