mmap 系统调用使用 Golang 进行读取



我不是 Go 不安全包专家 - 我也不是经验丰富的 C 程序员。我正在尝试使用 go> 中的 mmap 系统调用读取 1G 的大文件。我做mmap和munmap而不是读,写I/O的原因有很多。这是无关紧要的 - 我可以在测试中写入文件,当我从文件中读取时,我可以确定字节长度匹配,但我无法读取此字符串文件的内容:(有人可以建议一些阅读吗?我需要做更进一步的事情,这是我为示例测试准备的一些代码:

filename := "/tmp/dd_file.db"
f, err := os.OpenFile(filename, os.O_RDWR, 0666)
defer f.Close()
if err != nil {
    fmt.Printf("error opening file: %v", err)
}
stat, _ := f.Stat()
size := stat.Size()
fmt.Printf("[READ-ONLY] : size was : %+vn", size)
got := make([]byte, size)
if _, err := f.ReadAt(got, 0); err != nil && err != io.EOF {
    panic(err)
}
want, err := ioutil.ReadFile(filename)
if err != nil {
    fmt.Printf("[READ-ONLY] : ioutil.ReadFile: %v", err)
}
// going to change the file size now, punch in a few things
t := unsafe.Sizeof("")
if err != nil {
    fmt.Println(err)
    os.Exit(1)
}
_, err = f.Seek(int64(t-1), 0)
if err != nil {
    fmt.Println(err)
    os.Exit(1)
}
_, err = f.Write([]byte(" "))
if err != nil {
    fmt.Println(err)
    os.Exit(1)
}
mmap, err := syscall.Mmap(int(f.Fd()), 0, int(t), syscall.PROT_READ|syscall.PROT_WRITE, syscall.MAP_SHARED)
if err != nil {
    fmt.Println(err)
    os.Exit(1)
}
 // not too sure on reading data on string - doesnt work as expected.
map_array := (*[10000]string)(unsafe.Pointer(&mmap[0]))
map_array[0] = "yellow!"
err = syscall.Munmap(mmap)
if err != nil {
    fmt.Println(err)
    os.Exit(1)
}
newStat, _ := f.Stat()
newSize := newStat.Size()
fmt.Printf("[mmap( ) RW] : size was : %+vn", newSize)
got = make([]byte, newSize)
if _, err := f.ReadAt(got, 0); err != nil && err != io.EOF {
    panic(err)
}
if len(got) == len(want) {
    fmt.Println("well the lengths are equal atleast??!")
}
if !bytes.Equal(got, want) {
    fmt.Printf("n [mmap( ) RW] : works! got  %d n want %d", len(got), len(want))
}

这显然按预期工作 - 但是如果我想通过 mmap( ( 读取 mmap 文件,我如何从这些字节中读取字符串(我有一种感觉,某处有一个编码包,我可能不得不使用它,但随后不安全文档上的 StringHeader 让我感到困惑(。

建议。

正如@putu注释中所述,字节片可以通过简单的类型转换转换为字符串:

asStr = string(byteSlice) // entire slice as a string
partStr = string(byteSlice[:100]) // first 100 bytes as a string

最新更新