我需要将大型多维数组分配为char a[x][32][y]
,x * 32 * y大约为6~12G。 (x,y在运行时被确定。)
我想出了一种方法char *a=malloc(x*32*y)
,并*(a+32*y*i+y*j+k)
使用a[i][j][k]
。
然而,与a[i][j][k]
相比,这看起来并不那么方便。
还有更好的方法吗?
添加了:
它是a[x][32][datlen]
,其中datlen
在运行时被确定,x
是在考虑内存的情况下设置的。
数组中的整个数据都是新的。我有16或32GB内存的数学运行它。
答案 0 :(得分:4)
错误:在引用动态分配的内存时,您仍然可以使用[i] [j] [k]语法。
正确:使用宏来至少使工作更轻松
#define A(i,j,k) *(a+32*y*i+y*j+k)
A(1,2,3) would then do the right thing.
答案 1 :(得分:1)
我怀疑你会找到一个系统,它会为你分配大*的连续内存。你将不得不使用某种类型的分块策略。
您需要问:“您的数据访问模式是什么?”
如果它有一定的步幅(可以是1D或2D),请使用它为每个块选择合适的内存分配。使用数据结构来表示每个步幅(可能只是包含字符数组的结构)。
编辑:我没有注意到您使用a[i][j][k]
语法访问新发现的12G连续内存块的第二个“问题”。在我所知道的任何消费者C级分销中都不会发生这种情况。
(*)和640k应该是任何人的足够记忆。
答案 2 :(得分:0)
由于这是C,因此无法将所有内容都包装到一个方便的C ++对象中。
但我会做类似的事情。设计一系列分配,操作和销毁你的新数据类型的函数。
要读取或写入一段数据,请调用一个函数。切勿直接触摸数据。实际上,如果您可以对数据使用void*
句柄,甚至不将实际数据类型放在包含的头文件中,那么这是最好的事情。
通过这种方式,您可以将函数定义为在一个非常大的内存块,一组大内存块甚至是块上的磁盘数据库上运行。
现在我写了这封信,让我部分收回。如果需要更高性能,可能需要将包含的头文件中的所有函数定义为内联定义。这将使您的编译器几乎消除所有函数调用开销并积极优化。
我承认matrix_set(x, y, z, value)
不如matrix[x][y][z] = value
那么漂亮,但它也能正常运作。