Импорт файла csv с помощью node.js и postgresql

Я импортирую большое количество записей из файла csv. но я получаю сообщение об ошибке, похожее на то, что мне не хватает памяти.

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory

Ниже вы увидите мой код.

//date,date_block_num,shop_id,item_id,item_price,item_cnt_day
const company = 'COURSERA';
const csvFilePath = '/home/atlantageek/product_data/salesdata/sales_train.csv';
const { Client } = require('pg');

const csv = require("csvtojson");
const client = new Client({
    host: 'localhost',
    port: 5432,
    user: 'me',
    password: 'secretpassword',
    database: 'cooldb'
})
client.connect();


csv().fromFile(csvFilePath)
    .subscribe((json) => {
        //console.info(json);
        var dt = json.date.split('.');
        client.query("INSERT into series(orgName,  cat1, cat2, cat3, cat4,cat5,dt, val, attr1)" + 
                                " values($1::text, $2,   $3,   $4,   $5,  $6,  $7, $8,   $9)",
            [company, json.shop_id, json.item_id,'','','', dt[2] + '-' + dt[1] + '-' + dt[0], json.item_cnt_day, json.item_price]).then((result) => {
                console.info("-------------------");

            }).catch(e => {
                console.error(e.stack);
            })
    }, onError, onComplete)

function onError(err) { console.info(err) }
function onComplete(err) { console.info(err) }

Я знаю, что код неэффективен, и я могу делать массовые вставки, но помимо этого я думаю, что у меня заканчивается память, потому что у меня так много вставок в полете. С асинхронным характером узла, как мне замедлить вставки, чтобы у меня не было так много транзакций, выполняемых одновременно?

🤔 А знаете ли вы, что...
Node.js активно развивается и обновляется, чтобы соответствовать современным стандартам и требованиям.


1
631
1

Ответ:

Эта проблема может быть более сложной, чем вы думаете. Если вы просто хотите прочитать данные из файла csv и вставить в PG. Вы можете отложить операцию вставки с помощью setTimeout. Это может увеличить общее время, которое изначально должно было занять, но это действительно работает. Если вы хотите построить серьезную систему, которая может поддерживать высокий параллелизм. Я предлагаю использовать Redis и очередь сообщений. Использование некоторой библиотеки поможет вам. введите сюда описание ссылки