12

我将创建一个或多或少的结构:

type FileState struct {
    LastModified int64
    Hash string
    Path string
}

我想将这些值写入文件并在后续调用中读取它们。我最初的计划是将它们读入地图并使用键(路径)查找值(哈希和 LastModified)。在 Go 中有一种巧妙的方法吗?

如果没有,您可以推荐什么文件格式?我在以前的项目中阅读并尝试了一些键/值文件存储,但没有使用 Go。现在,我的要求可能相当简单,因此大型数据库服务器系统将是矫枉过正。我只想要一些我可以快速、轻松、便携地写入和读取的东西(Windows、Mac、Linux)。因为我必须部署在多个平台上,所以我试图将我的 non-go 依赖项保持在最低限度。

我考虑过 XML、CSV、JSON。我简要地查看了 Go 中的 gob 包,并注意到 Go 包仪表板上有一个 BSON 包,但我不确定这些是否适用。

我在这里的主要目标是快速启动和运行,这意味着我需要编写的代码量最少并且易于部署。

4

3 回答 3

10

只要您的整个数据适合内存,您就不应该有问题。使用内存映射并定期将快照写入磁盘(例如通过使用gob包)是一个好主意。Andrew Gerrand的Practical Go Programming演讲使用了这种技术。

如果您需要使用不同的程序访问这些文件,使用 json 或 csv 等流行的编码可能是一个好主意。如果你只需要从 Go 中访问这些文件,我会使用优秀的 gob 包,它有很多不错的特性

一旦您的数据变大,每次更改时总是将整个数据库写入磁盘并不是一个好主意。此外,您的数据可能不再适合 RAM。在这种情况下,您可能需要查看另一位 Go 开发人员 Nigel Tao 的leveldb键值数据库包。它目前正在积极开发中(但尚未可用),但它还将提供一些高级功能,如事务和自动压缩。此外,由于 leveldb 设计,读/写吞吐量应该相当不错。

于 2011-10-13T15:45:41.920 回答
2

我编写的 go 有一个有序的键值持久性库,名为 gkvlite -
https://github.com/steveyen/gkvlite

于 2013-05-03T06:59:04.580 回答
1

JSON 非常简单,但由于重复的变量名,会生成更大的文件。XML 没有优势。您应该使用 CSV,这也很简单。您的程序将少于一页。

但实际上,这取决于您的修改。如果您进行了大量修改并且必须将它们同步存储在磁盘上,那么您可能需要一些比单个文件更复杂的东西。如果您的地图主要是只读的,或者如果您可以负担得起很少(不是每秒)将其转储到文件中的费用,则内存中地图上的单个 csv 文件将使事情变得简单高效。

顺便说一句,使用 go 的 csv 包来执行此操作。

于 2011-10-13T13:05:38.987 回答