2009-07-06 21 views
1

バイナリファイルをRAMに直接読み込む方法はありますか?C++でRAMからファイルに直接データを読み込む

私が言っていることは、ここにファイルがあります。ここにRAMのブロックがあります。RAMにファイルの内容を入れてください。できるだけ早く移動してください。

現在、私はファイルを64ビットブロックでRAM(配列)の64ビットブロックにロードするifstreamでファイルを処理しています。しかし、私はそれがちょうどカップをピックアップするのではなく、ジャグ(RAM)にカップ(ファイル)の水を救済するためにシンブルを使用して(これは類推になります)一度に容器全体に内容物を入れる。

私はこのことについて全く新しい考え方として、私はこれについて間違った考えを持っているかもしれません。どんな指針も大きな助けになるでしょう。

私はRAMに大きなファイルを取得するための最も速い方法の直後です。

おかげ

+0

優れた質問、および1 :) –

答えて

11

あなたは1回のパスでファイルを読むことができないのはなぜですか?記憶に収まるには大きすぎますか?

また、マップされたファイル、UNIXを使用することができます。mmapの、Windowsの場合:私は何が必要だと思う

+0

おかげで、私はあなたの答えは私を助けovercomplicatedされていました。 – Columbo

2

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

2

あなたはどのプラットフォームを使用しているのかは言いませんが、メモリマップされたファイルのジョブのように聞こえます。

6

をCreateFileMapping関数はmemory mapped fileである、しかし、API)はUNIXで、私はそれはMMAP(だと信じて、あなたが上であるOSに依存します。

0

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

0

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

「ファイルをスワップしないようにして、いつもRAMに入れない」というのは、OSが大事にしているので、できると思います。

+0

私はこれを少し前からベンチマークしましたが、バッファサイズを増やしても、20〜40%のスピードアップは得られませんでした。メモリマッピングを使用すると、ほぼ確実に大幅に向上します。 –

0

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

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

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

0

Boostは、メモリマップされたファイルのクロスプラットフォームサポートを提供します。類推のための

Boost Memory Mapped files

関連する問題