使用node.js和postgresql导入csv文件

时间:2019-01-28 01:21:04

标签: node.js

我从csv文件导入大量记录。但是我收到一个错误,看起来我的内存不足了。

  

致命错误:接近堆限制分配的无效标记压缩失败-JavaScript堆内存不足

下面您将看到我的代码。

//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.log(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.log("-------------------");

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

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

我知道代码效率不高,我可以批量插入,但除此之外,我认为内存用完了,因为我有很多插入操作。使用Node内置的异步性质,如何减慢插入速度,所以我没有那么多事务同时运行?

1 个答案:

答案 0 :(得分:0)

此问题可能比您想象的要复杂。如果您只想从csv文件中读取数据并插入PG。您可以使用setTimeout延迟插入操作。这可能会增加原本应该花费的总时间,但确实有效。如果您想构建一个可以保持高并发性的认真系统。我建议使用redis和消息队列。使用一些库可以帮助您。 enter link description here