我有一个大约100GB的文件,每行word:tag
。我想在word
上为这些索引,以轻松获取给定单词的tag
列表。
我想将其保存在boltdb上(主要用于检出boltdb),但是随机写访问很差,所以我的目标是首先以其他方式对文件建立索引,然后将其全部移动到boltdb,而无需检查重复项或{/ {1}}列表的取消/序列化
因此,作为参考,如果我只是将文件读入内存(丢弃数据),则速度约为8 MB / s。
如果我使用代码如写入boltdb文件
tag
我获得约300 Kb / s的速度,这甚至还没有完成(因为它没有将 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)
}
}
添加到每个tag
中,仅存储了最后一次出现的速度)。因此,添加数组和JSON序列化肯定会降低该速度...
所以我尝试了mongodb
word
我也得到了大约300 Kb / s的速度(尽管 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()
}
}
和Upsert
在此附加到列表中)。
我也尝试了一个本地MySQL实例(在$push
上进行了索引),但是速度却慢了30倍...