2012-03-14 2 views
8

Like GuyFawkes、私は大量のデータを格納するためにMemoryStreamを使用したいと思いますが、「メモリ不足」の例外に遭遇し続けます。
TomTomの答えは私がしたいことです - 連続したブロックを必要としない実装を使用してください - しかし、私は自分自身を書いて私を保存するために、既に無料の実装が利用可能かどうか疑問に思っていますか?連続したメモリを使用しないオープンソースのMemoryStream実装がありますか?

大きなストリームで動作するMemoryStreamの良い、無料の再実装を知っている人はいますか?

EDIT:それはあまりにも遠くのMemoryStreamが目指しているの抽象化から外れる、ヘンクが言うしかしとして、

メモリマップトファイルのソリューションは非常に興味深いですし、私は他のプロジェクトのためにそれを覚えることでしょう。具体的には、既知容量の要件。
交換するデータは、場合によっては非常に大きいものですが、比較的小さいものもあります(それが遅すぎるまではわかりません)。さらに、クラスの多くのインスタンスが同時に存在することになります。 最終的には、MemoryMappedFilesを使用して(それぞれに適切なサイズを決定するために)必要な作業は、TomTomのソリューションを実装する作業と同等です。

+4

のStringBuilderで同様の問題は、ロープを使用するように実装を変更することによって、.NET 4に固定しました。グーグル "memorystreamロープ"は、最後にあるプログラマーのヒットを生成するだけです。 64ビットオペレーティングシステムは100ドルのソリューションです。 –

+0

OK、私は欠けている(バーEricとdtbは面白かったけど、私が必要としていたものではない)答えは「いいえ」と答え、自分でそれを実装しました。それは特に複雑ではないが、もし誰かが最高の場所を提案できるなら、私はそれをアップロードするだろうか? – sebf

+0

@HansPassant、ロープはおもしろい読書です。ありがとうございました(グーグル "memorystream rope"はまさにインスピレーションを得ていません!)私のプロジェクトでは、数百メガバイトのオーダーのストリームしか必要としませんでした。 – sebf

答えて

0

MemoryStreamの再実装ではありませんが、お客様の要件にMemory Mapped Fileを使用できるかどうかを検討してください。

メモリマップされたファイルは、大きなメモリバッファが解決でき、非常に効率的で、.NETによって直接サポートされる多くのクラスの問題を解決できます。

+0

しかし、必ずしもストリームを模倣するのが得策ではありません。 –

+0

AFAIKメモリマップファイルは固定サイズでなければなりません。 – Qwertie

+0

本当ですか?私は、メモリマップされたファイルにはプロセス内の連続した仮想アドレス空間が必要であると確信しています。彼らはこの問題を解決するのに役立たない。 –

1

あなたはファイルなしでMemoryMappedFileを作成します。つまり、システムメモリに存在するファイルはありません。 DelayAllocatePagesオプションは、メモリが実際に必要になるまで割り当てを遅らせます。ただし、事前に最大容量を指定する必要があります。 CreateViewStream Methodを使用してストリームを作成します。

+0

あなたとエリックありがとうございます。私はMemoryMappedFileソリューションを実装しようとしましたが、このケースではそれほど適切ではありません(説明するために詳細を追加しました)。 – sebf

+0

これは、プロセス内で連続した仮想アドレス空間とまったく同じ量を必要としないため、問題を解決できませんか? –

関連する問題