检查系统中的可用内存以获取新分配

时间:2014-05-15 16:21:45

标签: c++ memory-management mingw windows-7-x64

我正在使用Windows C ++应用程序来处理点云。我们使用PCL库以及QtOpenSceneGraph。这台电脑有4 GB的RAM。

如果我们加载很多点(例如,40点云总共有大约8亿点),那么系统会变得疯狂。

应用程序几乎没有响应(将鼠标移动到它周围需要很长时间,箭头会变为一个不停旋转的圆圈),在任务管理器中,在 Performance 标签中,我得到了这个输出:

内存(图片中的1):最多可达3,97 GB,几乎是系统总数。

免费(图片中为2): 0

Windos task admin

我已查看过帖子:herehere以及MEMORYSTATUSEX版本,我收到了内存信息。

这里的想法是,在加载更多云之前,检查可用内存。如果我们要加载的云的“权重”大于可用内存,则不加载它,因此应用程序不会冻结,用户有机会删除旧云以释放一些内存。值得注意的是,没有异常被抛出,我得到的最糟糕的情况是,当内存不足时,Windows会杀死应用程序本身。

现在,这是个好主意吗?是否有规范的方法来处理这件事?

我很高兴听到你对此事的看法。

3 个答案:

答案 0 :(得分:2)

您的观点与通常的解决类似问题的方法不同。

通常,人们可能会分配然后尝试锁定物理内存所需的空间。 (POSIX中为mlock(),WinAPI中为VirtualLock())。原因是,即使系统目前有足够的可用物理内存,其他一些进程也可能在下一刻产生并将部分驻留集推送到交换中。

这将要求您使用自定义分配器,并确保您的进程有权锁定所需的页数。

请在此处阅读:http://msdn.microsoft.com/en-us/library/windows/desktop/aa366895(v=vs.85).aspx

答案 1 :(得分:1)

即使加载了点,您的图形卡也可能会遇到内存问题。您也应该监控它。一旦你的加载点云超过你的专用显卡内存(在这种情况下几乎肯定是这样),渲染就会慢慢爬行。

8亿也是一个巨大的积分。每点至少有3个浮点数(假设没有着色),你说的是9.6GB的积分,所以你就像疯了一样交换。

一旦超过30-40万点,我通常会开始进行体素调制以减少内存使用量。

答案 2 :(得分:0)

这比你想象的要复杂得多。系统显示屏中显示的可用内存是物理内存。应用程序可用的内存量是虚拟内存。

物理内存由计算机上的所有进程共享。如果你有其他东西在同一时间运行。

- = - = - = - = - =

我怀疑你看到的问题是处理问题。在4GB系统上使用一半的内存应该没什么大不了的。

如果您正在进行冗长的计算,您是否给系统一个处理累积事件的机会?

这就是我怀疑真正的问题。