2012-04-07 14 views
1

Iサイズ1024x1024x1024の3次元アレイを割り当てるために、以下の単純な移動のコードを使用しています:Goで16GBのメモリを割り当てる方法は?

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)、最も内側の...とランタイムを()の呼び出しパニックを行います。メモリ不足:

これは、と正常に動作し、使用中の(17179869184)65536バイトのブロックを割り当てることができません低い256グリッド解像度、つまり256³、128³などです。構造体のサイズが4x4バイトなので、グリッド全体には正確に16GBのメモリが必要です。私のマシン(openSUSE 12.1 64bit)には、32 GBのアドレス指定可能な物理的な(つまり仮想ではない)メモリがあります。 Go(weekly.2012-02-22)がこれの半分を割り当てないのはなぜですか?

答えて

6

構造体には4x8ではなく4x8バイトがあります。

+0

ああ、ありがとう。どのように私はこれを逃すことができる。確かに物事を説明します:D – metaleap

4

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

あなたはファイルmalloc.gocに機能runtime·mallocinitを編集して(例えば32ギガバイトのような)大きな値に16ギガバイトから変数arena_sizeの値を大きくする必要があります大量のメモリを必要とするプロジェクトに移動を使用する予定の場合。編集後、

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

を実行し、プロジェクトを再コンパイルします。

+1

これは修正されており、現在は128GBに設定されています。https://code.google.com/p/go/source/detail?r=a310cb32c278 –

関連する問題