我正在构建一个简单的键值存储以获得乐趣。现在,我正在寻找一种在文件中插入切片的有效方法。
我目前的做法:
找到所需的偏移量
在缓冲区中存储所需插入点
将字节切片附加到该缓冲区
附加文件的其余部分
写入磁盘
问题是:
整个文件不能适合内存
效率低下
我查看了可用的库,遗憾的是我找到的最佳匹配os.WriteAt
会覆盖以下块。例如:
import "os"
func main() {
pathToFile := "./tmp"
bufferToWrite := []byte{255, 255, 255, 255, 255}
f, _ := os.OpenFile(pathToFile, os.O_CREATE|os.O_RDWR, os.PermMode)
defer f.Close()
f.Write(bufferToWrite)
因此,此时tmp
的内容将($: xxd -g 1 -b tmp
之后):
11111111 11111111 11111111(x)11111111 11111111
让我们尝试插入offset = 3(x)的东西:
bufferToInsert := []byte{0, 0}
f.WriteAt(bufferToInsert, 3)
}
输出将是:
11111111 11111111 11111111 00000000 00000000
我希望它是:
11111111 11111111 11111111 00000000 00000000 11111111 11111111
有什么想法吗?
答案 0 :(得分:1)
您可以从Git中复制包文件格式,而不是发明自己的文件格式。
基本思想是拥有索引文件和数据文件。如果要插入切片,只需将其附加到数据文件即可。然后更新索引文件,该文件通常较小。请注意,pack文件不是为实时更新而设计的,而是附带单个目标文件。
或者查看Berkeley DB文件格式。