巨大的数组大小 [1M] 可能堆栈溢出

Huge array size [1M] possible stack overflow

我正在为我的本科学位开发一个用 C 编写的 FEM 程序,该程序需要非常大的数组(包含 [1 000 000] 个元素的数组)来存储数据,然后对其进行操作。它也使用二维数组,它们具有类似的异常巨大的大小(比如 [100 000][100 000])。

程序终止,没有显示任何错误。发现刚要执行生成网格(使用大二维数组)的例程时,程序崩溃了。

当你达到如此大的尺寸时,你应该考虑你的矩阵是否真的有 100 000 x 100 000 个元素,或者它们中的大部分是否为空。如果大多数为零,则应使用 sparse matrices。这应该可以减少内存使用。

之后你应该尝试使用矩阵分解(例如lower upper)来解决你的系统,我相信你应该能够找到你喜欢的语言的实现。

other people interested in such large systems, so try and see how they did it, and take advantage of approximation / iterative solvers.

如果你在 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;

尽管如此,您将需要 很多 的可用内存。