Массовая вставка в MongoDB с использованием Mongoose - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь проанализировать файл CSV, полученный с помощью POST, в JSON, а затем загрузить его в мою базу данных MongoDB.Проблема в том, что я обнаружил, что следующий скрипт не так эффективен: он не такой быстрый и использует до 1,3 ГБ памяти, когда я пытаюсь проанализировать 4 CSV по 8,5 МБ каждый (~ 85 000 строк).

У кого-нибудь есть предложения по его улучшению?

router.route('/upload').post(upload.single('data'), function (req, res) {
    fs.rename(UPLOAD_PATH+req.file.filename, UPLOAD_PATH+req.file.originalname, function(err){
    if (err) return res.status(500).send("Problem in POST\n");
    res.status(200).send("File registered\n");

    var arr = []; // TODO should fix: too much memory?

    csv().fromFile(UPLOAD_PATH+req.file.originalname)
        .on('json', (jsonObj)=>{
            arr.push(jsonObj);
        })
        .on('done', (error)=>{
            console.log('End of parsing, length: '+arr.length)
            Ping.insertMany(arr)
                .then(function(docs) {
                    console.log('Inserted everything on DB')
                    arr.length = 0;
                })
                .catch(function(err) {
                    // TODO
                });
        });
    });
});

EDIT1: решено с помощью mongoimport

router.route('/upload').post(upload.single('data'), function (req, res) {
fs.rename(UPLOAD_PATH+req.file.filename, UPLOAD_PATH+req.file.originalname, function(err){
    if (err) return res.status(500).send("Problem in POST\n");
    res.status(200).send("File registered\n");

    const { exec } = require('child_process'); // TODO secrets?
    exec('mongoimport -h host -d db -c pings -u user -p passwd --file '+UPLOAD_PATH+req.file.originalname+' --type csv --headerline', (err, stdout, stderr) => {
        if (err) {
            // TODO
            console.log('Error')
            return;
        }

    });
});
});

Заранее спасибо:)

...