大家好日子,
我是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 x 8.000的+/-矩阵。但是,不是更大。所以,我想请求任何 light 来处理这种巨大的矩阵。
正如我之前所说:我是C的新手,所以请不要期待太多的经验。
提前感谢任何建议,
大卫亚历杭德罗。 PD:我的笔记本电脑配置为linux ubuntu,64位,i7和4GB内存。答案 0 :(得分:4)
对于这样大的矩阵,我会尽量避免对malloc
的所有调用。这将减少设置数据结构的时间并通过动态内存消除内存开销(malloc
存储有关块大小的其他信息)
只需使用malloc
一次 - 即:
#include <stdlib.h>
int *matrix = malloc(R * P * sizeof(int));
然后将索引计算为
index = column + row * P;
也顺序访问存储器,即首先按列访问。更好的缓存性能。
答案 1 :(得分:1)
嗯,30000 * 30000
ints
的二维数组(矩阵的大致类似C表示),假设每个int
有4个字节,将占用3.6 * 10^9
个字节,或~3.35千兆字节。没有传统系统允许您在编译时分配那么多静态虚拟内存,我不确定您是否可以使用malloc()
动态分配它。如果您只需要表示一个较小的数值范围,那么您可以使用char
来大幅减少程序的内存消耗(即,减少4倍)。如果你需要做类似的事情,例如,将布尔值赋给对应于数组索引的特定数字,你可以使用bitsets并进一步减少你的内存消耗(减少32倍)。否则,唯一可行的方法是使用较小的矩阵子集,如果需要可能将中间结果保存到磁盘。
如果你能详细说明你打算如何使用这些庞大的矩阵,我们或许可以提供一些更具体的建议。
答案 2 :(得分:0)
假设您将值声明为float
而非double
,则您的阵列大小约为3.4 GB。只要你只需要一个,并且你的Ubuntu系统上有虚拟内存,我想你可以用显而易见的方式对它进行编码。
如果您需要多个这么大的矩阵,您可能需要考虑:
在计算机中放入更多内存。
在计算群集上租用时间,并使用基于群集的处理来计算所需的值。
重写代码以处理数据的子集,并将每个子集写入磁盘并释放内存,然后再读取下一个子集。
您可能想要在Google搜索“处理大型数据集”
答案 3 :(得分:0)
我不知道如何添加评论,所以在这里删除答案。
我能想到的一件事是,你不会在运行程序中获得这些值。这些只来自一些文件。因此,取代所有值,继续逐个读取30,000x2,这样就不会进入内存。
对于30k * 30k矩阵,如果所有元素的初始值为0(或相同),则可以创建整个矩阵,创建一个60k * 3的矩阵(3个cols将为:row no,col没有和价值)。这是因为你将有最大60k的不同位置受到影响。
我知道这会有点慢,因为你总是需要查看元素是否已经添加。所以, 如果速度不是您的关注 ,这将有效。