读取Mmap的有效方法

我正在使用 syscall </ code>从 mmap中读取字节数组</ 代码>:</ p>

 <代码>文件,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 {...}
</ code> </ pre>

data </ code>是我需要的二进制数组 </ p>

我正在使用 || </ code>作为分隔符,因此我可以通过使用 bytes.Split </ code>:</ p>来获取切片。

  slices:= bytes.Split(data,[] byte(“ ||”))
for _,s:= range slice {
str:= string(s [:] )
fmt.Println(str)
}
</ code> </ pre>

这很好,而且我还存储了消息总数(其类型为 uint32 </ code>(占用8个字节),位于 mmap </ code>的开头。</ p>

当写入新消息时,我可以获得消息的总数 通过读取前8个字节。</ p>

假设我 消息的数量为 n </ code>,我仍然需要执行以下操作来读取新消息:</ p>

  slices:= bytes.Split(data  ,[] byte(“ ||”))
s:= slices [n-1]
str:=字符串(s [:])
fmt.Println(str)
</ code> </ pre> \ n

有没有更有效的方法?</ p>
</ div>

展开原文

原文

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?

douduidui1046
douduidui1046 您可以将msgpack用于数据的内部表示。
大约 2 年之前 回复
douchen7366
douchen7366 如果消息不是固定长度的,则它的有效性有一个明确的限制。获取消息n总是需要从0..n中读取每条消息,并解析每个字符以查找定界符(无论您是使用Split还是其他方法进行此操作)。
大约 2 年之前 回复
doutang2017
doutang2017 bytes.Split可能非常昂贵。要选择合适的数据结构,我们需要知道您要完成的工作。XY问题是在询问您尝试的解决方案,而不是实际问题:XY问题。
大约 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐