2011-08-06 2 views
2

2つの巨大なMemoryStreamを作成するメディアをストリームするプログラムがあり、完了したらゼロにする必要があります。問題は、MemoryStream.SetLength(0)を呼び出した後にメモリが再利用されていないように見えることです。 GC.Collect()は問題を解決するようですが、アプリケーションのすべてのスレッドがハングアップするため、これはプログラミングの習慣が悪いと聞いています。ハングスレッドはメモリをクリアするために短時間で問題になることはありません。しかし、この問題に対するもう一つの回避策があるといいでしょう。助言がありますか?MemoryStream.SetLength(0)とMemoryStream.Capacity = 0は使用済みメモリを消去しません

+0

もう1つの回避策は、しばらくの間、コンピュータ上で複数のメモリ集約型ビデオゲームをプレイし、GCが動作を開始するか、UnmanagedMemoryStreamを使用して、アンマネージコマンドを使用して消去することです。 – IDWMaster

+0

あなたは深く無意味な数字である「ワーキングセット」を見ています。タスクマネージャを使用しないでください。 –

+0

私はそうではありません。私はプロセスエクスプローラを使用しています。 – IDWMaster

答えて

5

GC.Collect()は、あなたが一度にメモリを収集するためにGCを強制する必要があると思うんなぜ何の問題...がない

問題を解決するようですか?それは、システムが必要と判断したときに行われます。 GCを超越しようとしないでください;)

+0

上記の理由からです。技術に精通したこのプログラムのユーザーは、何もストリーミングしていないアイドル状態のアプリケーションに対して、異常に大量のRAMを使用していることに気付くかもしれません。 – IDWMaster

+1

さて、大部分の "ビッグ"アプリは同じことをしています...ウェブブラウザのメモリ消費量を見てください –

+0

とにかく、気になるなら、あなたが何をしているのかわかっていれば、GC.Collectをいつでも明示的に呼び出すことができます。あなたのアプリがたくさんの仕事をしている間にそれをしないでください –

0

メモリにWriteメソッドをゼロで埋めてから、Flushを呼び出してからMemoryStreamのCloseメソッドまたはDisposeメソッドを呼び出して、残っているデータがストリームは廃棄された後もメモリに残ります。 (巨大なメモリストリームの場合は遅くなりますが、プログラムで実際のパフォーマンス上の問題が発生するかどうかをプロファイリングで判断した上で、これを心配する必要があります)

0

メモリストリームでdisposeを呼び出すことはできますか?それ以外の場合は、gc.collectを実行したときにperfが受け入れられない場合を除き、先に進んでください。私たちは、顧客が「gcがそのことをする」という説明が容認できないことを発見した同様の状況を抱えていました。それが害を及ぼさないならば、顧客が望むことをしなさい。

関連する問題