Как вставить миллионы документов в couchDB через curl? - PullRequest
0 голосов
/ 03 июня 2018

Мне нужно вставить 10 миллионов документов в CouchDB localhost.Я использовал скрипт Python для создания случайных данных в этом формате:

{
"docs": [
  {"_id": "0", "integer": 0, "string": "0"},
  {"_id": "1", "integer": 1, "string": "1"},
  {"_id": "2", "integer": 2, "string": "2"}
  ]
}

Размер файла составляет 1,5 ГБ, так как у меня есть 10 пар ключ-значение в каждом документе.

IЯ использую эту команду для загрузки файла json:

curl -d @db.json -H "Content-type: application/json" -X POST http://127.0.0.1:5984/new/_bulk_docs

Для 100 000 документов он загружается за 10-15 секунд, но для 10 000 000 он даже не загружается за 12 часов.

Буду признателен за любую помощь в том, как я могу массово вставить вставку в couchDB.

TIA

Ответы [ 2 ]

0 голосов
/ 03 июня 2018

Наконец, я разделил свой файл на 100 файлов, каждый из которых имеет 0,1 М записей, и загружен в базу данных с помощью этой команды.

FOR /L %i IN (0,1,9) DO (
    curl -d @dbn%i.json -H "Content-type: application/json" -X POST http://127.0.0.1:5984/new4/_bulk_docs
)
0 голосов
/ 03 июня 2018

Я не знаком с массовым API CouchDB, но вы упомянули, что массовый запрос с 100 000 записей работал, поэтому я подозреваю, что 10 000 000 это слишком много за один раз.

Рассмотрите возможность разделения вашего большого файла из 10 000 000 записей на меньшие JSON-файлы из 100 000 записей и размещения каждого куска / пакета отдельным запросом:

import json

# Batch function from: https://stackoverflow.com/a/8290508/7663649
def batch(iterable, n=1):
    l = len(iterable)
    for ndx in range(0, l, n):
        yield iterable[ndx:min(ndx + n, l)]

BATCH_SIZE = 100000
with open("db.json") as input_file:
    for batch_index, batch_list in enumerate(
            batch(json.load(input_file), BATCH_SIZE)):
        with open("chunk_{}.json".format(batch_index), "w") as chunk_file:
            json.dump(batch_list, chunk_file)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...