如何有效地在文件中插入字节切片?

时间:2016-11-01 18:49:14

标签: performance file go

我正在构建一个简单的键值存储以获得乐趣。现在,我正在寻找一种在文件中插入切片的有效方法。

我目前的做法:

  • 找到所需的偏移量

  • 在缓冲区中存储所需插入点

  • 之前的块
  • 将字节切片附加到该缓冲区

  • 附加文件的其余部分

  • 写入磁盘

问题是:

  • 整个文件不能适合内存

  • 效率低下

我查看了可用的库,遗憾的是我找到的最佳匹配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

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您可以从Git中复制包文件格式,而不是发明自己的文件格式。

基本思想是拥有索引文件和数据文件。如果要插入切片,只需将其附加到数据文件即可。然后更新索引文件,该文件通常较小。请注意,pack文件不是为实时更新而设计的,而是附带单个目标文件。

或者查看Berkeley DB文件格式。