gpt4 book ai didi

c# - 使用大量内存的 BitmapImages

转载 作者:太空宇宙 更新时间:2023-11-03 11:17:07 25 4
gpt4 key购买 nike

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

我将字节数组、MemoryStreams 和(当然)BitmapImages 保留在内存中。因此,我希望获得内存中存储的原始大小的大约三倍(也许更多),但 1.6GB 是荒谬的。

这可能是什么原因造成的?

预先感谢您的帮助。

最佳答案

没那么荒谬,真的。一个好的经验法则要牢记在心,JPEG 文件的平均大小约为保存为 BMP 文件的同一图像的 10%。有些图像的可压缩性更高,有些图像的可压缩性更低,JPEG 编码器的质量和压缩设置会产生显着差异,但根据我的经验,这一原则通常成立。

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

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

关于c# - 使用大量内存的 BitmapImages,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12355690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com