索引大文件的最佳方法

时间:2019-02-03 13:27:57

标签: mongodb go boltdb

我有一个大约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倍...

0 个答案:

没有答案