私は数日間今私を悩ませている問題があります。私はGoogleに問題を解決しようとしましたが、これまで同じ問題を抱えている人はいませんでした。C#System.Buffer.BlockCopyメモリの問題?
C#のSystem.Buffer.BlockCopyメソッドは、ある種のメモリゴーストを残しているようです。私は例えばこのメソッドを持っています:
private float[,] readFloatArray2 (byte[] b) {
int floatSize = sizeof(float);
float[,] v = new float[2, (b.Length/2)/floatSize];
System.Buffer.BlockCopy(b, 0, v, 0, b.Length);
return v;
}
バイト配列を2D浮動小数点配列に変換します。データはあらかじめストリームから読み込まれています。 問題は、System.Buffer.BlockCopyメソッドに位置しています。
BlockCopyコマンドを削除した場合、アプリケーションで使用されるメモリのサイズは半分になります。これは、バイト配列がまだ生きているという私のせいではないということです。 BlockCopyコマンドを使用しないと、バイト配列が正常に終了しないためです。とにかくフロート配列が作成されます(コピーされた情報の有無にかかわらず)。
BlockCopyコマンドまたはGCの問題であるかどうかはまだ分かりませんが、System.GC.Collect(); BlockCopyの後に、それも完全に機能します(私はあなたがこれをしてはいけないことを知っています...なぜ私がここで助言を求めているのか)。
私はまた質問しても構いませんが、問題には数百メガが含まれます。
メモリの問題の他に、このメソッドは完全に正常に機能します。誰でもメモリの問題の原因を知っていますか?事前に
挨拶と感謝 OLI
PS:私は、Visual Studio 2010 PROとWIN7で.NET4.0を使用していますが...これが関連しているかどうかわかりません。
メモリが 'GC.Collect'によって適切に収集されているとすれば、すべて正常です。 'b' *は最終的に時が来ると通常のGCによって収集されます。 –
オーディオデータを扱っているなら、 'float [len] [channelCount]'の形式のギザギザの配列を使います。そうすることで、チャンネルを別々に扱うことができます。これは便利なこともあります。 – CodesInChaos
"とにかくフロート配列が作成されます。それは必ずしも物理メモリを必要としません。メモリページはすべて0であり、書き込まれていないメモリはWindowsメモリマネージャによって最適化されます。 – CodesInChaos