0

3 つの 2 次元配列を計算する必要があります。GMPライブラリを使用してアレイを初期化しようとしたとき。次のエラーが発生しました。

GNU MP: Cannot allocate memory (size=16)
Aborted (core dumped)

私のメモリは8GBです。t_columnは約 2500rowです。変数であり、10^7 を超える場合があります。コードの一部は次のようになります: (最後の for ループでエラーが発生します)

    mpf_t **h;
    mpf_t **t;
    mpf_t **r;
    h = (mpf_t**)malloc(sizeof(mpf_t *)*row);
    t = (mpf_t**)malloc(sizeof(mpf_t *)*row);
    r = (mpf_t**)malloc(sizeof(mpf_t *)*256);
    int i, d, j;

    for(i = 0; i < row; i++) {
        h[i] = (mpf_t *)malloc(sizeof(mpf_t)*256);
    }
    for(i = 0; i < row; i++) {
        t[i] = (mpf_t *)malloc(sizeof(mpf_t)*t_column);
    }
    for(i = 0; i < 256; i++) {
        r[i] = (mpf_t *)malloc(sizeof(mpf_t)*t_column);
    }

    for(i = 0; i < row; i++) {
        for(j = 0; j < 256; j++)  {
            mpf_init2(h[i][j], 8);
            mpf_set_str(h[i][j], "0.0", 0);
        }
    }

どうすればこれを回避できますか? 他のライブラリがより優れたメモリ割り当て機能を備えている場合、私はそれを受け入れます。

4

1 に答える 1

1

t_column=2500 および row=10^7 の場合、プログラムは約 2883 MB のメモリを割り当てます。

この問題には、物理​​メモリ サイズに問題はありません。32 ビット オペレーティング システムを使用している場合、2^32=4GB のメモリ アドレス空間があります。通常、カーネルは 1GB のアドレス空間を使用するため、残りの 3GB で連続した空間を見つけることができず、malloc() に失敗しても不思議ではありません。

于 2013-04-28T15:41:14.690 に答える