如何在Go中分配16GB的内存?

时间:2012-04-07 01:15:03

标签: memory-management go ram large-data-volumes

我正在使用以下简单的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()调用恐慌... 运行时:内存不足:无法分配65536字节块(17179869184正在使用中) )

这适用于较低的网格分辨率,即256³,128³等。现在,由于结构的大小为4x4字节,整个网格应该只需要16 GB的内存。我的机器(openSuse 12.1 64bit)具有32 GB的可寻址物理(即非虚拟)内存。为什么Go(weekly.2012-02-22)甚至不会分配一半呢?

2 个答案:

答案 0 :(得分:6)

结构有4x8字节,而不是4x4。

答案 1 :(得分:4)

在当前的Go语言实现中,在64位CPU上,Go运行时从操作系统中保留了16GB的虚拟内存。这将Go程序使用的总内存限制为16GB。

如果您计划在需要大量内存的项目中使用Go,则需要编辑文件malloc.goc中的函数runtime·mallocinit,并将变量arena_size的值从16GB增加到更大的值(例如32GB)。编辑后,运行

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

然后重新编译你的项目。