大家好,
我是C编程方面的新手,对于如何处理C中非常庞大的矩阵,我没有太多的知识,例如矩阵大小为30.000 x 30.000。
我的第一种方法是动态存储内存:
int main()
{ int **mat;
int j;
mat = (int **)malloc(R*sizeof(int*));
for(j=0;j<R;j++)
mat[j]=(int*)malloc(P*sizeof(int));
}处理8.000×8.000的+/-矩阵是个好主意。但是,不是更大。所以,我想要任何光来处理这种巨大的矩阵,请。
正如我之前说过的:我是C的新手,所以请不要期望太多的经验。
,谢谢您的建议,
大卫·亚历杭德罗。
PD:我的笔记本电脑是、64位、i7和4gb的ram。
发布于 2012-06-03 22:17:51
对于这样大的矩阵,我会尽量避免对malloc的所有调用。这将减少设置数据结构和使用动态内存删除内存开销的时间(malloc存储有关块大小的附加信息)。
只需使用malloc一次,即:
#include <stdlib.h>
int *matrix = malloc(R * P * sizeof(int));然后将索引计算为
index = column + row * P;此外,按顺序访问存储器,即先按列访问。缓存的性能更好。
发布于 2012-06-03 22:25:35
30000 * 30000 ints的二维数组(大致类似于矩阵的C表示),假设每个int有4个字节,将占用3.6 * 10^9字节,即3.35G字节。传统的系统不会允许您在编译时分配那么多静态虚拟内存,我也不确定您是否能够用malloc()动态地分配它。如果您只需要表示一个很小的数值范围,那么您就可以通过使用char大幅减少程序的内存消耗(即减少4倍)。如果您需要执行类似的操作,例如,将布尔值赋给与数组索引相对应的特定数字,则可以使用位集并进一步减少内存消耗(减少32倍)。否则,唯一可行的方法是处理矩阵的较小子集,如果必要,可能将中间结果保存到磁盘中。
如果你能详细说明你打算如何使用这些巨大的矩阵,我们也许可以提供一些更具体的建议。
发布于 2012-06-03 22:08:49
假设您将值声明为float而不是double,则数组的大小约为3.4GB。只要您只需要一个,并且您在您的Ubuntu系统上有虚拟内存,我认为您就可以用显而易见的方式编写这个代码。
如果您需要这么大的多个矩阵,您可能需要考虑:
在计算集群上的computer.
您可能需要在Google上搜索“处理大数据集”。
https://stackoverflow.com/questions/10874258
复制相似问题