我有一个word:tag
每行大约 100gb 的文件。我想索引这些word
以轻松获取tag
给定单词的 s 列表。
我想把它保存在boltdb上(主要是为了检查boltdb),但是随机写访问很糟糕,所以我的目标是首先以其他方式索引文件,然后将它全部移动到boltdb而不需要检查重复或反序列化tag
名单的
因此,作为参考,如果我只是将文件读入内存(丢弃数据),我会得到大约 8 MB/s。
如果我使用代码写入 boltdb 文件,例如
line := ""
linesRead := 0
for scanner.Scan() {
line = scanner.Text()
linesRead += 1
data := strings.Split(line, ":")
err = bucket.Put([]byte(data[0]), []byte(data[1]))
logger.FatalErr(err)
// commit on every N lines
if linesRead % 10000 == 0 {
err = tx.Commit()
logger.FatalErr(err)
tx, err = db.Begin(true)
logger.FatalErr(err)
bucket = tx.Bucket(name)
}
}
我得到大约 300 Kb/s 的速度,这甚至不完整(因为它没有添加tag
到 each word
,只存储最后一次出现)。所以添加数组和 JSON 序列化肯定会降低速度......
所以我试了一下mongodb
index := mgo.Index{
Key: []string{"word"},
Unique: true,
DropDups: false,
Background: true,
Sparse: true,
}
err = c.EnsureIndex(index)
logger.FatalErr(err)
line := ""
linesRead := 0
bulk := c.Bulk()
for scanner.Scan() {
line = scanner.Text()
data := strings.Split(line, ":")
bulk.Upsert(bson.M{"word": data[0]}, bson.M{"$push": bson.M{"tags": data[1]}})
linesRead += 1
if linesRead % 10000 == 0 {
_, err = bulk.Run()
logger.FatalErr(err)
bulk = c.Bulk()
}
}
而且我也得到了大约 300 Kb/s(尽管在Upsert
这里$push
处理附加到列表)。
我也尝试使用本地 MySQL 实例(索引在 上word
),但速度慢了 30 倍......