Лучший способ проиндексировать большой файл - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть файл размером около 100 ГБ с word:tag на строку.Я хочу проиндексировать их на word, чтобы легко получить список tag s для данного слова.

Я хотел сохранить это на boltdb (в основном для проверки boltdb), но произвольный доступ к записи плох, так чтоЯ собирался сначала проиндексировать файл каким-то другим способом, а затем переместить все это в boltdb без необходимости проверять дубликаты или де / сериализацию списка tag

Итак, для справки, если я простопрочитав файл в память (исключая данные), я получаю около 8 МБ / с.

Если я пишу в файлы 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 КБ / сскорость, и это даже не завершено (поскольку оно не добавляет tag к каждому 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 Кб / с (хотя Upsert и $push здесь описывают добавление к списку).

Я также пытался с локальным экземпляром MySQL (индексированным на word), но скорость была примерно в 30 раз медленнее ...

...