我从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内置的异步性质,如何减慢插入速度,所以我没有那么多事务同时运行?
答案 0 :(得分:0)
此问题可能比您想象的要复杂。如果您只想从csv文件中读取数据并插入PG。您可以使用setTimeout
延迟插入操作。这可能会增加原本应该花费的总时间,但确实有效。如果您想构建一个可以保持高并发性的认真系统。我建议使用redis和消息队列。使用一些库可以帮助您。
enter link description here