1

我正在为三个非常大的数组(N = 990000001)分配内存。我知道您必须在堆上分配它,因为它太大了,但即使我这样做,程序也会不断崩溃。是我分配不正确还是我的计算机根本没有足够的内存(我应该有足够的内存)?可能是问题的另一件事是我以某种方式错误地分配了我的内存。当 N 很小时,我现在分配内存的方式非常好。任何帮助表示赞赏。

int main()
{
double *Ue = new double[N];
double *U = new double[N];
double *X = new double[N];
for (int i = 0; i < N; i++)
{
    X[i] = X0 + dx*i;
    Ue[i] = U0/pow((X0*X[i]),alpha);
}

//Declare Variables
double K1;double K2; double K3; double K4;

//Set Initial Condition
U[0] = U0;
for (int i = 0; i < N-1; i++)
{
    K1 = deriv(U[i],X[i]);
    K2 = deriv(U[i]+0.5*dx*K1,X[i]+0.5*dx);
    K3 = deriv(U[i]+0.5*dx*K2,X[i]+0.5*dx);
    K4 = deriv(U[i]+dx*K3,X[i+1]);
    U[i+1] = U[i] + dx/6*(K1 + 2*K2 + 2*K3 + K4);
}

return 0;
}
4

2 回答 2

3

您的程序分配并使用了大约 24 GB 的内存。

如果您是 32 位进程的程序,这将抛出std::bad_alloc,并且您的程序将正常退出。(理论上,您的工具链中可能存在溢出错误,但我认为这不太可能。)

如果您是 64 位进程的程序,您可能会被 OOM 杀手卡住,并且您的程序将不正常地退出。除非您有 24 GB 的 RAM + 交换组合,否则您可能会以磁盘的速度运行。(如果您实际上有24 GB 的 RAM,那么它可能不会崩溃,因此我们可以排除这种情况。)如果禁用过度使用,那么您将获得std::bad_allocOOM 杀手。(这一段是特定于 Linux 的,尽管其他内核是相似的。)

解决方案:使用更少的内存或购买更多的 RAM。

于 2013-02-07T06:10:43.307 回答
0

如果在 Windows 上,您可能会发现此信息对 Windows 上的应用程序的内存限制很有用-

请注意,静态和堆栈数据的限制在 32 位和 64 位变体中是相同的。这是由于 Windows 可移植可执行文件 (PE) 文件类型的格式,该文件类型用于描述链接器布局的 EXE 和 DLL。它具有用于图像部分偏移和长度的 32 位字段,并且未针对 Windows 的 64 位变体进行扩展。与在 32 位 Windows 上一样,静态数据和堆栈共享相同的前 2GB 地址空间。

然后,唯一真正的改进——

动态数据 - 这是在程序执行期间分配的内存。在 or C 或 C++ 中,这通常使用mallocor来完成new

64 位

  • 静态数据 2Gb

  • 动态数据 8Tb

  • 堆栈数据 1GB(堆栈大小由链接器设置,默认为 1MB。可以使用链接器属性 System > Stack Reserve Size 增加)

单个数组的分配“应该能够分配到操作系统愿意处理的大小”(即受 RAM 和碎片限制)。

于 2013-02-07T07:23:58.557 回答