作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在尝试编写一个 Go 程序,它使用 mmap
将包含 float32
值的非常大的文件映射到内存中。这是我的尝试(受 previous answer 启发,为简洁起见省略了错误处理):
package main
import (
"fmt"
"os"
"syscall"
"unsafe"
)
func main() {
fileName := "test.dat"
info, _ := os.Stat(fileName)
fileSize := info.Size()
n := int(fileSize / 4)
mapFile, _ := os.Open(fileName)
defer mapFile.Close()
mmap, _ := syscall.Mmap(int(mapFile.Fd()), 0, int(fileSize),
syscall.PROT_READ, syscall.MAP_SHARED)
defer syscall.Munmap(mmap)
mapArray := (*[n]float32)(unsafe.Pointer(&mmap[0]))
for i := 0; i < n; i++ {
fmt.Println(mapArray[i])
}
}
此操作失败并显示以下错误消息:
./main.go:21: non-constant array bound n
因为 n
是由文件的长度决定的(在编译时不知道),我不能在转换中用常量值替换 n
。如何将 mmap
转换为 float32
值的数组(或 slice )?
最佳答案
您首先转换为具有适合数据的静态长度类型的数组,然后将该数组 slice 为正确的长度和容量。
mapSlice := (*[1 << 30]float32)(unsafe.Pointer(&mmap[0]))[:n:n]
关于arrays - Go:如何将 unsafe.Pointer 转换为指向未知长度数组的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39215392/
我是一名优秀的程序员,十分优秀!