我有几个打包好的int64文件.我需要在内存中将它们作为int64切片.问题是所有的文件都超过了机器内存大小的一半,所以空间是有限的.围棋中的标准选项类似于:

a := make([]int64, f.Size()/8)
binary.Read(f, binary.LittleEndian, a)

不幸的是,binary package会立即分配一个大小为f.Size()*8[]byte,并耗尽内存.

如果我一次读取一个字节并将其复制到片中,它确实可以工作,但这太慢了.

理想的情况是将[]byte直接转换为[]int64,只需告诉编译器"好了,这些现在是整型了",但显然这不起作用.有什么方法可以实现类似的结果吗?如果绝对需要,可以使用不安全的包或直接使用C语言?

推荐答案

我有几个打包好的int64文件.我需要在内存中将它们作为int64切片.问题是所有的文件都超过了机器内存大小的一半,所以空间是有限的.

围棋中的标准选项类似于:

a := make([]int64, f.Size()/8)
binary.Read(f, binary.LittleEndian, a)

不幸的是,二进制包将立即分配一个大小为f.Size()*8的[]字节,并耗尽内存.


为最大限度地减少内存使用量:

func readFileInt64(filename string) ([]int64, error) {
    b, err := os.ReadFile(filename)
    if err != nil {
        return nil, err
    }
    i64Ptr := (*int64)(unsafe.Pointer(unsafe.SliceData(b)))
    i64Len := len(b) / int(unsafe.Sizeof(int64(0)))
    i64 := unsafe.Slice(i64Ptr, i64Len)
    return i64, nil
}

Go相关问答推荐

VS代码,Golang格式顽固的情况与switch / case

如何在另一个文件夹中使用Delve运行二进制文件?

使用Digitorus/pdfsign在GO(Golang)中签署pdf文件

如何使用gopher-lua定义一个Lua函数,该函数有一个预定义的表作为param,Lua脚本可以在其中访问该函数中的表?

Redis:尽管数据存在,但 rdb.Pipelined 中出现redis:nil错误

生成一个 CSV/Excel,在 Golang 中该列的下拉选项中指定值

GORM中是否可能自动迁移具有循环关系的表?

hyperledger fabric - go:在 $PATH 中找不到可执行文件

Go 切片容量增长率

Apache Beam 左加入 Go

Go http.FileServer 给出意外的 404 错误

为什么当我忽略 template.New() 程序可以成功运行?

Golang并发写入多个文件

将 []float64 像素切片转换为图像

Grafana/Prometheus 将多个 ip 可视化为查询

在 Golang 中获取谷歌云服务帐户的访问令牌?

如何使用带有Electron 表格 ID、Electron 表格名称、表格 ID 和值的 golang 在 googlesheet 中插入数据

Go模板中的浮点除法

处理程序中的无限循环

手动下载并放置一个 golang mod 文件