C#:管理大内存缓冲区

时间:2011-03-07 18:22:55

标签: c# memory-management pixels

我正在维护一个用C#编写的视频应用程序。 我需要尽可能多的内存分配/释放控制 对于大内存缓冲区(数百兆字节)。

在编写时,需要释放像素数据时,像素缓冲区 设置为null。有没有更好的释放记忆的方法? 垃圾收集大型物体的成本是否很高?

谢谢!

3 个答案:

答案 0 :(得分:3)

不要扔那样的大缓冲,你很幸运。视频提供了大量重复使用的机会。在您确定不再需要它之前不要丢失缓冲区。在何时收集它并不重要。

答案 1 :(得分:1)

从我记忆中收集大型垃圾的垃圾成本非常高。根据我的阅读,它们在分配时自动成为第2代(它们在大对象堆中分配)。而且由于它们很大,它们会强制频繁生成第2代。

所以我宁愿为位图数组实现手动池,甚至使用非托管内存。有一些池类,并在像素/位图类的Dispose中将数组返回给它。

答案 2 :(得分:1)

对于大(“数百兆”)的内存块,应该相对容易地知道使用它们的人和地点(无论如何你只能在内存中容纳10-20个这样的块)。由于ypu计划使用这样数量的mmeory,你需要仔细预算内存使用量 - 即整个缓冲区的简单副本将花费非平凡的时间。

完成特定区块后,您可以自行强制GC。这听起来像GC.Collect API的合理使用 - 你完成了使用所有内存的大部分内容。

如果它适用于您的应用程序,您也可以考虑切换到较小(64k)块的分配并将它们链接在一起。这将更好地与垃圾收集结合,并可为您的应用程序提供更大的灵活性。