У меня есть файл размером около 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 раз медленнее ...