1

次の単純な Go コードを使用して、サイズ 1024x1024x1024 の 3D 配列を割り当てています。

grid = make([][][]TColor, 1024)
for x = 0; x < 1024; x++ {
    grid[x] = make([][]TColor, 1024)
    for y = 0; y < 1024; y++ {
        grid[x][y] = make([]TColor, 1024)
    }
}

その TColor 構造体は、4 成分の float64 ベクトルです。

type TColor struct { R, G, B, A float64 }

割り当ての途中 (x=477 および y=~600ish) で、最も内側の make() 呼び出しでパニックが発生します...

これは、256³、128³ などの低いグリッド解像度でも問題なく動作します。構造体のサイズは 4x4 バイトであるため、グリッド全体でちょうど 16 GB のメモリが必要になります。私のマシン (openSuse 12.1 64 ビット) には、32 GB のアドレス指定可能な物理 (つまり、非仮想) メモリがあります。Go (weekly.2012-02-22) がこの半分も割り当てられないのはなぜですか?

4

2 に答える 2

6

構造体は 4x4 ではなく 4x8 バイトです。

于 2012-04-07T01:32:19.980 に答える
4

Go 言語の現在の実装では、64 ビット CPU で Go ランタイムがオペレーティング システムから 16 GB の仮想メモリを予約します。これにより、Go プログラムが使用する合計メモリが 16GB に制限されます。

大量のメモリを必要とするプロジェクトで Go を使用する場合はruntime·mallocinit、ファイルmalloc.gocの関数を編集し、変数の値をarena_size16GB からより大きな値 (32GB など) に増やす必要があります。編集後、実行します

cd $GOROOT/src/pkg/runtime
go tool dist install -v

その後、プロジェクトを再コンパイルします。

于 2012-04-07T06:00:25.410 に答える