C编程中非常庞大的矩阵

时间:2012-06-03 22:00:14

标签: c matrix

大家好日子,

我是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内存。

4 个答案:

答案 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的不同位置受到影响。

我知道这会有点慢,因为你总是需要查看元素是否已经添加。所以, 如果速度不是您的关注 ,这将有效。