0

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

4

0 回答 0