如何在创建许多位图时防止内存问题

本文关键字:内存 问题 位图 创建 许多 | 更新日期: 2023-09-27 18:04:34

我需要在短时间内处理许多位图,我通过使用线程来执行。现在,我记得我把它们都处理掉了,我没有内存泄漏。通常我的应用程序打开几个线程(我控制它们的数量-现在我同时只执行4个),每个线程处理一个大的位图,并做一些额外的图形处理。

一切都很好,直到我处理——让我说——多达100位图在一排。我的应用程序使用opendialog,所以我打开100个第一个位图,然后我的应用程序自动处理它们。完成后,我打开下一批100位图,以此类推(所以在这些批之间有一个明显的暂停)。这很好。而且这个应用一直是开着的。我没有看到内存泄漏,处理完最后一批后,它保持稳定,我可以处理更多。

当我在单个批处理中选择更多位图时出现问题-超过300个,所以我的应用程序处理所有位图而没有一秒钟的暂停。接近尾声,我得到GDI+内存不足的错误,我的应用程序挂起与1.7 GB内存消耗。

我的猜测是系统无法在这么短的时间内释放内存(我的应用程序正在保留更多)。这可能吗?如何处理这种情况?我不想只是在过程中增加一个愚蠢的延迟。我想安排一下。

更新:原因很简单,应用程序被错误地编译为32位,因此只有~2GB的可用内存。虽然GC需要时间来释放内存,但应用程序仍然为更多的位图保留更多的内存,应用程序达到极限,并挂起。

我将应用程序编译为64位,它完美地工作。此外,我将控制内存的使用,所以它不会像现在这样无人看管的工作。感谢所有的建议和有趣的改进点!

如何在创建许多位图时防止内存问题

取决于你所说的"短时间"有多长,你绝对可以查看内存映射文件。使用它们可以显著地降低RAM内存压力,并且不会在速度上损失太多。但是,正如我一开始说的,这取决于你需要它们的处理速度。

所以我绝对建议你也看看这个选项,衡量一下,看看它是否符合你的需求。

您的应用程序是否编译为32位进程?如果是这样,无论机器有多少RAM,都将耗尽2Gb的内存。编译为64位将允许您充分利用所有的系统内存,并且在RAM开始耗尽时将使用交换空间(这当然会减慢应用程序的速度,但可能是比抛出内存异常更好的解决方案)。