尽管有无限的ulimit,为什么非常大的堆栈分配会失败?

尽管有无限的ulimit,为什么非常大的堆栈分配会失败?,第1张

概述以下静态分配给出了分段错误 double U[100][2048][2048]; 但是下面的动态分配很顺利 double ***U = (double ***)malloc(100 * sizeof(double **));for(i=0;i<100;i++){ U[i] = (double **)malloc(2048 * sizeof(double *)); for(j= 以下静态分配给出了分段错误
double U[100][2048][2048];

但是下面的动态分配很顺利

double ***U = (double ***)malloc(100 * sizeof(double **));for(i=0;i<100;i++){    U[i] = (double **)malloc(2048 * sizeof(double *));    for(j=0;j<2048;j++)    {        U[i][j] = (double *)malloc(2048*sizeof(double));    }}

linux中的ulimit设置为无限制.

有人能给我一些暗示发生什么事吗?

解决方法 当你说ulimit设置为unlimited时,你使用-s选项吗?否则,这不会更改堆栈限制,只会更改文件大小限制.

但是,无论如何都会出现堆栈限制.我可以分配:

double *u = malloc(200*2048*2048*(sizeof(double)));  // 6gb contiguous memory

运行二进制文件我得到:

VmData:  6553660 kB

但是,如果我在堆栈上分配,它是:

double u[200][2048][2048];VmStk:   2359308 kB

这显然不正确(暗示溢出).使用原始分配,两者给出相同的结果:

Array:  VmStk:   3276820 kBmalloc: VmData:  3276860 kB

但是,运行堆栈版本,无论数组的大小如何,我都无法生成段错误 – 即使它超过系统上实际的总内存,如果设置了-s unlimited.

编辑:

我在循环中使用malloc进行了测试,直到失败

VmData: 137435723384 kB  // my system doesn't quite have 131068gb RAM

但是,堆栈使用率从未达到4gb以上.

总结

以上是内存溢出为你收集整理的尽管有无限的ulimit,为什么非常大的堆栈分配会失败?全部内容,希望文章能够帮你解决尽管有无限的ulimit,为什么非常大的堆栈分配会失败?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1033186.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存