【问题标题】:How to allocate 16GB of memory in Go?如何在 Go 中分配 16GB 内存?
【发布时间】:2012-04-20 12:12:17
【问题描述】:

我正在使用以下简单的 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 64 位)有 32 GB 的可寻址物理(即非虚拟)内存。为什么 Go (weekly.2012-02-22) 连一半都分配不上?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 啊,谢谢。我怎么能错过这个。确实可以解释事情:D
    【解决方案2】:

    在 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
    

    然后重新编译您的项目。

    【讨论】:

    猜你喜欢
    • 2015-10-11
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    相关资源
    最近更新 更多