CSV в Cloudant Импорт большого набора данных - PullRequest
0 голосов
/ 22 апреля 2020

Я работаю над сценарием на Nodejs, чтобы импортировать большой CSV-файл в базу данных IBM Cloudant. Мой подход к этому сценарию заключается в следующем:

  • Script1: загрузка ZIP-файлов с удаленного сервера по FTP-соединению.
  • Script1: перебор загруженных zip-файлов и извлечение из них CSV-файлов .
  • Script1: загрузка каждого CSV-файла в AWS S3 с использованием потоков чтения и записи файлов.
  • Script2: подключение к S3-коду и итерация по каждому CSV-файлу, найденному там в указанном c расположение корзины.
  • Script2: чтение CSV-файла с использованием потока и передача его для преобразования данных CSV в формат JSON.
  • Script2: подключение к облачной базе данных IBM.
  • Script2: примите каждый JSON объект один за другим для проверки существующего облачного документа, сделав запрос GET.
  • Script2: Если документ найден, обновите его объектом JSON, иначе создайте запись в cloudant как новый документ с отдельным запросом API для того же.
  • Script2: Удалить CSV-файл из корзины S3, если все данные CSV успешно перенесены в облачную базу данных.

Что работает до сих пор:

  • Загрузка ZIP-файла с FTP, извлечение CSV-файла из ZIP и загрузка его в корзину S3.
  • Чтение CSV-файла в виде потока и преобразование его в JSON объект, использующий npm пакет "csvto json", работает как шарм, если мы просто печатаем каждый преобразованный JSON объект на терминале.
  • Соединение с облачной базой данных IBM успешно.

Проблема, с которой сталкиваются:

  • Во всех oop, пытающихся проверить существующие записи в cloudant для каждого JSON объекта, он просто не go выходит за пределы нескольких записей и заканчивается памятью / Ошибка, связанная с кучей, также имеет проблемы с предельной скоростью, которая насыщается очень быстро, поскольку операции поиска и импорта происходят внутри l oop.

Точная ошибка:

  • ФАТАЛЬНАЯ ОШИБКА: Неэффективные компактные метки близки к пределу кучи. Выделение не удалось - JavaScript куча нехватки памяти.
  • Слишком много запросов в IBM Cloudant.

Примечания:

  • Возможно на сервере FTP будет несколько файлов ZIP.
  • Возможно, в файлах ZIP будет несколько файлов CSV.
  • Один из файлов CSV, который я пытался импортировать, содержит из примерно 1,3 миллиона записей и файлов размером около 300 МБ.
  • У меня нет возможности подумать об увеличении ограничения скорости в IBM Cloudant для этого требования.

Может кто-нибудь предложить лучший способ справиться с этим требованием, не сталкиваясь с проблемами, как я уже упоминал выше? Любая альтернативная npm упаковка для удовлетворения этого требования также приветствуется. Любое предложение внести изменения в мой подход к разработке также приветствуется.

1 Ответ

0 голосов
/ 23 апреля 2020

Предполагая, что строки CSV отсортированы по идентификатору, вы можете сначала выполнить массовое получение:

Запрос:

POST /db/_all_docs HTTP/1.1
Accept: application/json
Content-Length: 70
Content-Type: application/json
Host: localhost:5984

{
    "keys" : [
        "a_id123",
        "b_id123",
        "c_id123",
        "d_id123",
    ]
}

Затем вы получите что-то вроде следующее: Ответ

{
    "total_rows" : 2666,
    "rows" : [
        {
            "value" : {
                "rev" : "1-a3544d296de19e6f5b932ea77d886942"
            },
            "id" : "a_id123",
            "key" : "a_id123"
        },
        {
            "value" : {
                "rev" : "1-91635098bfe7d40197a1b98d7ee085fc"
            },
            "id" : "b_id123",
            "key" : "b_id123"
        }
    ],
    "offset" : 0
}

Теперь вы можете l oop через ответ и посмотреть, какие документы существуют, а какие нет.

После этого вы можете массово добавить документы, которые не существуют:

Запрос:

POST /db/_bulk_docs HTTP/1.1
Accept: application/json
Content-Length: 109
Content-Type:application/json
Host: localhost:5984

{
    "docs": [
        {
            "_id": "c_id123",
            "foo": "bar",
        },
        {
            "_id": "d_id123",
            "foo": "bar c",
        },
        {
            "_id": "a_id123",
            "_rev": "1-a3544d296de19e6f5b932ea77d886942",
            "foo": "updated",
        }
    ]
}

Документация для массового получения: https://docs.couchdb.org/en/stable/api/database/bulk-api.html#post - db-_all_docs

Документация для массового создания / обновления: https://docs.couchdb.org/en/stable/api/database/bulk-api.html#db -bulk-docs

...