0

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

一个我使用的测试用例需要大量的存储器(围绕[600] [600] [600]),其超过了极限允许和在bad_alloc的结果。

我已经尝试过在小块图分离,而且它不工作,因为它似乎总内存已超过极限。

我的问题是,我怎么能与下PC的限制,例如大型3D体积工作?

*编辑

元素类型是一个结构如下:

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

的元素基于其在3D空间中的位置的多阵列索引。

的多阵列是由从文件上的空间设置的特定点,然后通过前向和后向掩模越过整个空间填充的中间空间构成。

在此先感谢

回答

0

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

第二种解决方案是让他们适应你的RAM上的数据进行工作。你有216万分,但我们不知道一分的大小。他们是3D,但他们使用浮动或双打?他们是一个阶级还是简单的结构?他们有vtable吗?你使用Debug版本吗? (在Debug对象中可能会更大)。你是在开始还是增量分配整个数组?我相信在当前PC上存储216M的3D点应该没有问题,但这取决于所有这些问题的答案。

这使我想到的第三个方法是使用内存映射文件,但我从来没有使用过个人。


这里有几件事情尝试:

尝试在不同批次分配,如:1 * 216M,1K * 216k,1M * 216,看你有多少内存可以得到。

尝试将提升映射更改为std :: vector甚至原始void *并比较可以获得的最大RAM。

0

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

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