1

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

一切正常,直到我处理让我说 - 最多连续 100 个位图。我的应用程序使用 opendialog,所以我打开 100 个第一个位图,然后我的应用程序会自动处理它们。完成后,我打开下一批 100 个位图,依此类推(所以在这些批次之间有一个明显的停顿)。这工作正常。该应用程序一直处于打开状态。我没有看到内存泄漏,在处理完最后一批后它保持稳定,我可以处理更多。

当我在一个批次中选择更多位图时出现问题 - 超过 300 个,因此我的应用程序处理所有这些位图时没有一秒钟的暂停。接近尾声时,我收到 GDI+ Out of Memory 错误,我的应用程序因消耗 1.7 GB 内存而挂起。

我的猜测是系统无法在这么短的时间内释放内存(而且我的应用程序正在保留更多)。是否可以?如何处理?我不想只是在过程中添加一个愚蠢的延迟。我想管理它。

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

我将应用程序编译为 64 位,它可以完美运行。此外,我将控制内存使用,因此它不像现在这样无人看管。感谢所有提示和有趣的改进点!

4

2 回答 2

1

要看你说的那个“短时间”有多长,你绝对可以看Memory Mapped Files。使用它们可以显着降低 RAM 内存压力,并且不会降低速度。但是,正如我首先所说,这取决于您需要它们处理多快。

所以我肯定会建议也看看这个选项,测量一下它是否符合你的需求。

于 2013-03-19T09:49:54.637 回答
1

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

于 2013-03-19T10:05:45.910 回答