douren5490 2018-07-17 13:26
浏览 112

读取Mmap的有效方法

I am using syscall to read a byte array out of mmap:

file, e := os.Open(path)
if e != nil {...}
defer file.Close()

fi, e := file.Stat()
if e != nil {...}
data, e := syscall.Mmap(int(file.Fd()), 0, int(fi.Size()), syscall.PROT_READ, syscall.MAP_SHARED)
if e != nil {...}

data is the binary array I need.

I am using || as a delimiter, so I can get slices by using bytes.Split:

slices := bytes.Split(data, []byte("||"))
for _, s := range slices {
    str := string(s[:])
    fmt.Println(str)
}

This works fine, and I also stored the total number of messages (its type is uint32 which takes 8 bytes) at the beginning of the mmap.

When a new message is written in, I can get the total number of messages by reading the first 8 bytes.

Assuming I have the number of messages as n, I still need to do the following to read the new message:

slices := bytes.Split(data, []byte("||"))
s := slices[n - 1]
str := string(s[:])
fmt.Println(str)

Is there a more efficient way to do this?

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥50 永磁型步进电机PID算法
    • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
    • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
    • ¥15 如何处理复杂数据表格的除法运算
    • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
    • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
    • ¥200 uniapp长期运行卡死问题解决
    • ¥15 latex怎么处理论文引理引用参考文献
    • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
    • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?