大型3D体积bad_alloc

时间:2014-03-03 10:16:28

标签: memory-management 3d large-data-volumes voronoi boost-multi-array

我正在开发一个应用程序,该应用程序使用动态分配的boost multi_array创建从3D点云创建的3D Voronoi图,以存储整个图表。

我正在使用的一个测试用例需要大量内存(大约[600] [600] [600]),这超出了允许的限制并导致bad_alloc。

我已经尝试将图表分成小块,但它也不起作用,因为似乎总内存已超出限制。

我的问题是,如何在PC限制下使用如此大的3D体积?

*编辑

Element类型是一个结构如下:

struct Elem{
  int R[3];
  int d; 
  int label;
}

元素根据它们在3D空间中的位置在多阵列中编制索引。

通过在文件空间中设置特定点,然后通过在整个空间上传递前向和后向遮罩来填充中间空间来构建多阵列。

提前致谢

2 个答案:

答案 0 :(得分:0)

你没有说你如何获得所有积分。如果您从文件中读取它们,则不要全部阅读它们。如果你计算它们,那么你可以根据需要重新计算它们。在这两种情况下,您都可以实现一些缓存,以存储最常用的缓存。如果您知道算法将如何使用数据,那么您可以预测接下来需要哪些值。您甚至可以在不同的主题中执行此操作。

第二个解决方案是处理您的数据,以便它们适合您的RAM。你有216亿点,但我们不知道点数的大小。它们是3D但他们使用浮动还是双打?它们是一个类还是简单的结构?他们有vtables吗?你使用Debug build吗? (在Debug对象中可能更大)。您是在开始时还是以递增方式分配整个数组?我相信在当前的PC上存储216M的3D点应该没有问题,但它取决于所有这些问题的答案。

我想到的第三种方法是使用内存映射文件,但我从未亲自使用它们。


以下是一些可以尝试的事情:

尝试分配不同的批次,例如:1 * 216M,1k * 216k,1M * 216,以查看您可以获得多少内存。

尝试将boost map更改为std :: vector甚至raw void *并比较你可以获得的最大RAM。

答案 1 :(得分:0)

你没有提到元素类型。给元素是一个四字节float,600 * 600 * 600矩阵只需要大约820M字节,实际上并不是很大。我建议您检查操作系统对每个进程的内存使用量的限制。对于Linux,请使用ulimit -a进行检查。

如果你真的无法在内存中分配矩阵,请在磁盘上创建一个所需大小的文件,使用mmap将其映射到内存。然后将mmap返回的内存地址传递给boost::multi_array_ref