Rob*_*obb 11 c++ memory-management
我有一个应用程序,有时会利用大量的数据.用户可以选择加载图形显示中使用的许多文件.如果用户选择的数据多于操作系统可以处理的数据,则应用程序会很难崩溃.在我的测试系统上,这个数字大约是2 GB的物理RAM.
处理这种情况的好方法是什么?我从新的尝试捕获中得到了"坏的分配",但我仍然遇到了崩溃.我觉得好像我正在艰难的水域中加载这么多数据,但这个应用程序需要处理这种大数据负载.
编辑:我现在正在32位Windows系统下进行测试,但该应用程序将运行在各种版本的Windows,Sun和Linux上,大多数是64位但是大约32位.
错误处理并不强大:它只是用一个try catch块包装主实例化代码,catch捕获每个另一个对等方的抱怨,即每次都无法捕获bad_alloc.
我认为你们是对的,我需要一个内存管理系统,它不会将所有这些数据加载到RAM中,它就像是这样.
编辑2:路德说得最好.谢了,兄弟们.现在,我只需要一种方法来防止崩溃,并且应该可以进行适当的异常处理.但在未来,我将实施该接受解决方案.
Nor*_*ame 17
有一个STXXL库,为大型数据集提供类似STL的容器.
将"大"改为"巨大".它专为多核处理数据集而设计和优化,仅适用于TB级磁盘.这可能足以解决您的问题,或者实施可能是定制您自己的解决方案的良好起点.
很难说你的应用程序崩溃,因为在内存条件紧张时会遇到很多问题:你可能遇到硬地址空间限制(例如默认情况下32位Windows每个用户进程只有2GB的地址空间) ,这是可以改变的,http://www.fmepedia.com/index.php/Category:Windows_3GB_Switch_FAQ),否则就会被吃掉由OOM杀手(不是神兽活着:,看到http://lwn.net/Articles/104179 /).
在任何情况下我都建议考虑一种将数据保存在磁盘上的方法,并将主存储器视为数据的一种Level-4缓存.例如,如果您有数据blob,那么将它们包装在一个类中,该类可以在需要时透明地从磁盘加载blob并注册到某种内存管理器,这可以让一些blob持有者释放他们的记忆在记忆条件变得无法忍受之前.因此缓冲区缓存.