0

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

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

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

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

*编辑

Element 类型是一个结构体,如下所示:

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

元素根据它们在 3D 空间中的位置在多数组中进行索引。

多数组是通过在文件空间上设置特定点,然后通过在整个空间上传递前向和后向掩码来填充中间空间来构造的。

提前致谢

4

2 回答 2

0

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

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

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


这里有几件事可以尝试:

尝试分批分配,比如:1 * 216M, 1k * 216k, 1M * 216 看看你能得到多少内存。

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

于 2014-03-03T17:14:10.233 回答
0

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

如果您确实无法在内存中分配矩阵,请在磁盘上创建一个所需大小的文件,使用mmap. 然后将返回的内存地址传递给mmapto boost::multi_array_ref

于 2014-03-04T04:12:40.793 回答