2

今天是个好日子,

我是 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 的 +/- 矩阵是个好主意。但是,不是更大。所以,我想请任何来处理这种巨大的矩阵,拜托。

正如我之前所说:我是 C 新手,所以请不要期望太多经验。

提前感谢您的任何建议,

大卫亚历杭德罗。

PD:我的笔记本电脑配置是 linux ubuntu、64 位、i7 和 4gb 内存。

4

4 回答 4

5

对于这么大的矩阵,我会尽量避免所有对malloc. 这将减少设置数据结构的时间并消除动态内存的内存开销(malloc存储有关块大小的附加信息)

只需使用malloc一次 - 即:

#include <stdlib.h>
int *matrix = malloc(R * P * sizeof(int));

然后将索引计算为

index = column + row * P;

还按顺序访问内存,即首先按列。更好的缓存性能。

于 2012-06-03T22:17:51.083 回答
1

30000 * 30000 ints好吧,假设每个 4 个字节,一个 的二维数组(大致类似于矩阵的 C 表示)int将占用3.6 * 10^9字节,或约 3.35 GB。没有传统系统允许您在编译时分配那么多静态虚拟内存,我不确定您是否可以成功地动态分配它malloc()。如果您只需要表示一个小的数值范围,那么您可以通过使用大幅(即,4 倍)减少程序的内存消耗char. 如果您需要执行类似的操作,例如,将布尔值分配给与数组索引对应的特定数字,您也许可以使用位集并进一步减少内存消耗(减少 32 倍)。否则,唯一可行的方法是使用矩阵的较小子集,如有必要,可能会将中间结果保存到磁盘。

如果您能详细说明您打算如何使用这些海量矩阵,我们或许可以提供一些更具体的建议。

于 2012-06-03T22:25:35.640 回答
0

我不知道如何添加评论,所以在这里放弃答案。

我能想到的一件事是,您不会在运行程序中获得这些值。这些将仅来自某些文件。因此,取而代之的是所有值,继续一一读取 30,000x2,这样就不会进入记忆。

对于 30k*30k 矩阵,如果所有元素的初始值为 0(或相同),您可以做的是创建整个矩阵,而是创建一个 60k*3 的矩阵(3 列将是:行号、列号和值)。这是因为您将有最多 60k 个不同的位置会受到影响。

我知道这会有点慢,因为您总是需要查看元素是否已添加。因此,如果您不关心速度,这将起作用。

于 2012-06-04T11:19:21.090 回答
0

假设您将值声明为float而不是double,则您的数组大小约为 3.4 GB。只要您只需要一个,并且您的 Ubuntu 系统上有虚拟内存,我认为您可以用显而易见的方式编写代码。

如果您需要多个这么大的矩阵,您可能需要考虑:

  • 将更多的 RAM 放入您的计算机。

  • 在计算集群上租用时间,并使用基于集群的处理来计算您需要的值。

  • 重写代码以处理数据的子集,并将每个子集写入磁盘并释放内存,然后再读取下一个子集。

您可能想在 Google 上搜索“处理大型数据集”

于 2012-06-03T22:08:49.407 回答