我正在使用Windows C ++应用程序来处理点云。我们使用PCL
库以及Qt
和OpenSceneGraph
。这台电脑有4 GB的RAM。
如果我们加载很多点(例如,40点云总共有大约8亿点),那么系统会变得疯狂。
应用程序几乎没有响应(将鼠标移动到它周围需要很长时间,箭头会变为一个不停旋转的圆圈),在任务管理器中,在 Performance 标签中,我得到了这个输出:
内存(图片中的1):最多可达3,97 GB,几乎是系统总数。
免费(图片中为2): 0
我已查看过帖子:here和here以及MEMORYSTATUSEX
版本,我收到了内存信息。
这里的想法是,在加载更多云之前,检查可用内存。如果我们要加载的云的“权重”大于可用内存,则不加载它,因此应用程序不会冻结,用户有机会删除旧云以释放一些内存。值得注意的是,没有异常被抛出,我得到的最糟糕的情况是,当内存不足时,Windows会杀死应用程序本身。
现在,这是个好主意吗?是否有规范的方法来处理这件事?
我很高兴听到你对此事的看法。
答案 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系统上使用一半的内存应该没什么大不了的。
如果您正在进行冗长的计算,您是否给系统一个处理累积事件的机会?
这就是我怀疑真正的问题。