2012-04-07 21 views
1

ich den folgenden einfachen Go Code bin mit einem 3D-Array der Größe 1024x1024x1024 zuzuordnen:Wie Zuweisen von 16 GB Speicher in Go?

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) 
    } 
} 

Die TColor Struktur ist ein 4-Komponenten-float64 Vektor:

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

Halfway (x = 477 und y = ~ 600ish) durch die Zuweisung, das am weitesten innen machen() -Aufruf panics mit ... Laufzeit: aus der Erinnerung: nicht vergeben 65536-Byte-Block (17179869184 im Einsatz)

Dies funktioniert gut mit niedrig Grid-Auflösungen, dh 256³, 128³ usw. Da die Größe der Struktur 4x4 Bytes beträgt, sollte das gesamte Raster genau 16 GB Speicher benötigen. Meine Maschine (openSuse 12.1 64bit) hat 32 GB adressierbaren physischen (dh nicht virtuellen) Speicher. Warum kann Go (weekly.2012-02-22) nicht einmal die Hälfte davon zuweisen?

Antwort

6

Die Struktur hat 4x8 Bytes, nicht 4x4.

+0

Ah, danke dafür. Wie könnte ich das vermissen? In der Tat, das erklärt Dinge: D – metaleap

4

In der aktuellen Implementierung der Go-Sprache reserviert die Go-Laufzeit auf 64-Bit-CPUs 16 GB virtuellen Speicher vom Betriebssystem. Dies begrenzt den von einem Go-Programm belegten Gesamtspeicher auf 16 GB.

Wenn Sie planen, gehen in Projekte zu verwenden, die viel Speicherplatz benötigen, müssen Sie die Funktion runtime·mallocinit in Datei malloc.goc und erhöhen den Wert der Variablen arena_size von 16 GB zu einem größeren Wert (zB 32 GB) bearbeiten. Nach der Bearbeitung führen Sie

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

und dann neu kompilieren Sie Ihr Projekt.

+1

Ich wollte nur verfolgen, dass dies behoben wurde und jetzt auf 128 GB eingestellt ist: https://code.google.com/p/go/source/detail?r=a310cb32c278 –