我使用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("数据")。
根据我的搜索,它不能被控制,因为它是一个流。
欢迎任何建议!
答案 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