如何在nodejs之前/之上调用setImmediate。(' data')node -s中的fast-csv

时间:2016-06-06 12:29:02

标签: javascript node.js csv

我使用fast-csv(https://www.npmjs.com/package/fast-csv)来解析csv文件。

它可能有10k记录,因此需要花费大量时间进行解析,并且该服务器上的几乎所有其他操作都会被阻止。

所以我想使用" setImmediate()"延迟记录的执行/解析。这样其他进程也可以获得cpu时间。

csv
.fromPath(csvfile, {headers: true, discardUnmappedColumns:true, ignoreEmpty:true})
.validate( function(record) {
    //some validations here
})
.on("data-invalid", function(record){
    logger.error("Validation of record failed:" + record);
})
.on("data", function(record){
    // i know i can add a setImmediate here but i dont want the code to parse all the records in csv at a go.
    // i want to call setImmediate above the .on("data") so that the contacts are validated/parsed slowly(when they get cpu as per setImmediate)
});

以上或任何其他方式来控制/延迟.on("数据")。

根据我的搜索,它不能被控制,因为它是一个流。

欢迎任何建议!

2 个答案:

答案 0 :(得分:0)

  

所以我想使用update tbl2 set tbl2.transaction_id = tbl1.id_trans from tbl1 inner join tbl2 on tbl1.id = tbl2.transaction_id where tbl2.transaction_id = 53; 来延迟记录的执行/解析...或任何其他方式来控制/延迟setImmediate()

.on("data")将无法为您提供帮助;即使它会产生事件循环,由于正在读取CSV文件,你的管道已经屈服于事件循环。

相反,您可以使用concurrent-map-stream之类的模块来限制正在执行的并发数据库查询的数量,这可能是您正在运行的真正问题。

例如,要将查询数限制为100:

setImmediate()

答案 1 :(得分:0)

我通过在数组中推送每条记录(我进入.on(“data”))然后使用async.mapLimit()来解决我的问题来解决这个问题

参考此处https://github.com/caolan/async#mapcoll-iteratee-callback并在此处找到示例http://promise-nuggets.github.io/articles/16-map-limit.html