Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用大量内存的位图图像_C#_.net_Silverlight - Fatal编程技术网

C# 使用大量内存的位图图像

C# 使用大量内存的位图图像,c#,.net,silverlight,C#,.net,Silverlight,我有一个应用程序,它从XML文件(到字节数组)读取JPEG,生成MemoryStream,并使用这些来实例化位图图像。JPEG的整个大小约为60 MB。但是,我的应用程序的内存使用量是1.6GB(之后会发生系统内存不足异常) 我将字节数组、内存流和(当然)位图图像保留在内存中。因此,我希望存储在内存中的大小大约是原始大小的三倍(可能更多),但1.6GB是荒谬的 这可能是什么原因造成的 提前谢谢你的帮助。真的没那么荒谬。要记住的一条经验法则是,JPEG的平均大小约为作为BMP保存的同一图像大小的1

我有一个应用程序,它从XML文件(到字节数组)读取JPEG,生成MemoryStream,并使用这些来实例化位图图像。JPEG的整个大小约为60 MB。但是,我的应用程序的内存使用量是1.6GB(之后会发生系统内存不足异常)

我将字节数组、内存流和(当然)位图图像保留在内存中。因此,我希望存储在内存中的大小大约是原始大小的三倍(可能更多),但1.6GB是荒谬的

这可能是什么原因造成的


提前谢谢你的帮助。

真的没那么荒谬。要记住的一条经验法则是,JPEG的平均大小约为作为BMP保存的同一图像大小的10%。有些图像的可压缩性更强,有些图像的可压缩性更小,JPEG编码器的质量和压缩设置会产生显著差异,但根据我的经验,这一原则通常适用

如果我们在这种情况下接受规则为true,那么您的程序仅存储了至少720MB的图像数据;字节数组和内存流中的60MB JPEG数据,然后是600MB未压缩的BMP图像。此外,该程序还将自身和任何被引用的第三方二进制文件加载到同一内存空间(包括被引用框架名称空间的DLL;人们常常忘记,框架不是“免费”使用的,因为它是“内置的”),记住,某些收藏品以一种非常乐观的方式要求自己拥有记忆;例如,每次达到列表的内部最大容量时,它都会将自身大小调整为以前的两倍。字典也做同样的事情,增加了维护两个内部数组结构的开销;一个用于键散列,另一个用于包含链接到键散列的实际值的“节点”。这种行为很容易导致处理大量对象集合的程序请求比运行时允许提供的内存更多的内存。然后,如果这是一个图形应用程序,那么运行时为每个处理图形元素的线程维护一个消息循环,并钩住每个图形元素(每个“窗口”,尽管这个术语用词不当,因为实际上所有GUI元素都是“窗口”,而不仅仅是通常称为窗口的窗体对象)


所有这些都很容易使应用程序需要1.6GB的托管内存。然后,当应用程序请求增加400MB内存(以调整大型集合的大小)或请求超过21亿的新句柄时(即使在64位操作系统中,NET也使用32位索引,因此运行时每个进程只能跟踪总共232个不同的内存地址),运行时将注入OOME。

您能发布一些代码吗?您使用的是什么版本的框架?您可能遇到大对象堆碎片问题。请尝试使用其他技术来解析XML。e、 g.去掉解析XML的代码,对字符串进行Base64转换,看看是否仍然存在内存问题。对不起,我忘记了一些信息。清空任何非BitmapImage源对内存使用没有实质性影响,而清空BitmapImage则会将其清除。因此,BitMapImage可能正在存储对字节数组和内存流的引用?我如何解决这个问题?