Вставка 500k записей в mongodb одна за другой приводит к нехватке памяти - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь вставить 500 000 записей в коллекцию mongodb. Эти значения сохраняются в csv и анализируются, а затем сохраняются в массиве. И используя рекурсивные функции, вставляющие записи одну за другой, и когда одна запись вставляется снова, вызывается та же самая функция. Этот процесс работает для 200 000 записей, но когда размер записи увеличивается более чем на 200 000, он вызывает кучу нехватки памяти (трассировка стека JS).

Ниже приведена рекурсивная функция, которую я использую

function insertMongoSingle(fileRows, x, total){
    if(x < total){
        let item = fileRows.shift();
        let record  = new Record({i:item}, false);
        record.save(function(error, contact){
            if(error){
                console.log(error);
                x++;
                insertMongoSingle(fileRows, x ,total);
            }else{
                x++;
                insertMongoSingle(fileRows, x, total);
            }
        }); 
    }else{
        console.log('completed');
    }
}

где x - количество, fileRows - общее количество записей в массиве объектов, а total - длина fileRows

.

Ответы [ 2 ]

0 голосов
/ 01 октября 2019

У вас нет выбора для импорта данных CSV с помощью командной строки? если у вас есть, это может быть лучше, используя mongoimport. Если это не так и вы хотите проанализировать и настроить данные перед сохранением в БД, тогда используйте анализатор потока CSV. Собирайте и обрабатывайте записи партиями. Допустим, у каждого пакета есть 5000 записей. Вставьте каждый пакет с помощью `Model.insertMany (records), очистите его и создайте новый пакет, обработайте и повторяйте, пока вы не закончите все пакеты (записи).

Монгоимпорт

 mongoimport -d dbname -c collectionName --type csv --file input.csv --headerline

Программно:

const csv = require('fast-csv');
const fs =   require('fs')
let records = [];
let limits = 5000
fs.createReadStream('my.csv')
    .pipe(csv.parse({ headers: true}))
    .on('error', error => console.error(error))
    .on('data', row => {
         // customize your data here 
        records.push(row);
       if(recors.legth==limits) {
       Model.insertMany(records)
       records = [];
      }
     })
    .on('end', rowCount => {
   });
0 голосов
/ 01 октября 2019

Я бы предложил использовать массовая вставка возможности монго.

Подробный ответ на stackoverflow уже был дан: Вставка большого массива объекта вmongodb from nodejs

Или, если вам нужно альтернативное решение, вы можете проверить мой пример загрузки: Загрузка 10K исходных данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...