首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C程序设计中非常大的矩阵

C程序设计中非常大的矩阵
EN

Stack Overflow用户
提问于 2012-06-03 22:00:13
回答 4查看 6.4K关注 0票数 2

大家好,

我是C编程方面的新手,对于如何处理C中非常庞大的矩阵,我没有太多的知识,例如矩阵大小为30.000 x 30.000。

我的第一种方法是动态存储内存:

代码语言:javascript
复制
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。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-06-03 22:17:51

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

只需使用malloc一次,即:

代码语言:javascript
复制
#include <stdlib.h>
int *matrix = malloc(R * P * sizeof(int));

然后将索引计算为

代码语言:javascript
复制
index = column + row * P;

此外,按顺序访问存储器,即先按列访问。缓存的性能更好。

票数 5
EN

Stack Overflow用户

发布于 2012-06-03 22:25:35

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

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

票数 1
EN

Stack Overflow用户

发布于 2012-06-03 22:08:49

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

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

在计算集群上的computer.

  • Renting时间中,
  • 在时间中放置了更多的内存,并使用基于集群的处理来计算您的代码的值,以处理数据的子集,并在读取下一个子集之前将每个子集写入磁盘并释放内存。

您可能需要在Google上搜索“处理大数据集”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10874258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档