1

3 つの非常に大きな配列 (N = 990000001) にメモリを割り当てています。これは非常に大きいため、ヒープに割り当てる必要があることはわかっていますが、そうしてもプログラムはクラッシュし続けます。割り当てが間違っているのでしょうか、それともコンピュータに十分なメモリがないのでしょうか (十分なはずです)。もう 1 つの問題は、メモリの割り当てが間違っていることです。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 キラーに引っ掛かり、プログラムが異常終了する可能性があります。RAM とスワップの合計が 24 GB でない限り、ディスクの速度で大量に消費される可能性があります。(実際に24 GB の RAM がある場合、おそらくクラッシュしないので、これを除外できます。) オーバーコミットが無効になっている場合std::bad_allocは、OOM キラーの代わりに取得されます。(このパラグラフは Linux 固有のものですが、他のカーネルも同様です。)

解決策:メモリの使用量を減らすか、RAM を追加購入してください。

于 2013-02-07T06:10:43.307 に答える