我正在研究一个用C编写的FEM程序,我的本科学位需要非常大的数组(包含[1 000 000]个元素的数组)来存储数据,然后对它们进行操作。它也使用2D阵列,它们具有相似的非常大的尺寸(例如[100 000] [100 000])。
程序终止而不显示任何错误。已经发现,只要程序执行生成网格的例程(使用大型2D数组),它就会崩溃。
答案 0 :(得分:3)
当你达到如此大的尺寸时,你应该考虑你的矩阵是否真的有100 000 x 100 000个元素,或者它们中的大多数是否为空。如果大多数为零,则应使用sparse matrices。这应该可以减轻记忆的使用。
之后你应该尝试使用矩阵分解(例如lower upper)来解决你的系统,我相信你应该能够用你最喜欢的语言找到实现。
有other people interested in such large systems,所以请尝试看看他们是如何做到的,并利用approximation / iterative solvers。
答案 1 :(得分:2)
如果你在64位模式下编译,gcc和Clang都不会对这样大的数组有任何问题,提供你在堆上分配它们并记住元素的数量超过了一个int。所以:
#define MATRIXSIZE (100*1000L)
typedef float row_t[MATRIXSIZE];
row_t *matrix = calloc(MATRIXSIZE, sizeof(*matrix));
for (int i = 0; i<MATRIXSIZE; i++)
matrix[i][i] = 1.0f;
你需要一个很多的可用内存。