Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在nodejs中调用setImmediate before/above.on(';data';)fast csv_Javascript_Node.js_Csv - Fatal编程技术网

Javascript 如何在nodejs中调用setImmediate before/above.on(';data';)fast csv

Javascript 如何在nodejs中调用setImmediate before/above.on(';data';)fast csv,javascript,node.js,csv,Javascript,Node.js,Csv,我使用FastCSV()解析csv文件 它可能有10k条记录,因此需要花费大量时间进行解析,并且该服务器上的几乎所有其他操作都会被阻止 所以我想使用“setImmediate()”来延迟记录的执行/解析。所以其他进程也会得到cpu时间 csv .fromPath(csvfile, {headers: true, discardUnmappedColumns:true, ignoreEmpty:true}) .validate( function(record) { //some vali

我使用FastCSV()解析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(“数据”)的方式

根据我的搜索,它无法控制,因为它是一条流

欢迎提出任何建议

因此,我想使用
setImmediate()
来延迟记录的执行/解析…或者任何其他方法来控制/延迟(“数据”)上的

setImmediate()
将无法帮助您;尽管它将屈服于事件循环,但由于正在读取CSV文件,您的管道已经屈服于事件循环

相反,您可以使用类似的模块来限制正在执行的并发数据库查询的数量,这可能是您遇到的真正问题

例如,要将查询数限制为100,请执行以下操作:

function queryWorker(record, done) {
  performQuery(record, done);
};

var queue       = require('concurrent-map-stream');
var queueStream = queue(queryWorker, 100).on('data', function(record) {
  ...
}).on('close', function() {
  // done
});

csv.fromPath(...).pipe(queueStream);

我解决了这个问题,方法是将每个记录(我进入.on(“数据”))放入一个数组中,然后使用async.mapLimit()放入.on(“end”)中,这解决了我的问题


请参阅此处并在此处找到一个示例

4MB、36K的CSV记录文件在我的机器上大约500毫秒内被解析。您的文件有多大(文件大小),解析需要多长时间?此外,由于您的代码在内部使用解析器流,因此正在异步解析文件,并且应该已经向事件循环屈服。实际上解析速度非常快,但问题是,对于每个记录,我都有多个数据库操作,这会减慢解析速度。我无法优化业务逻辑,所以我只想延迟操作,以便队列有一些空间/时间来处理其他请求。对,所以问题不是您需要屈服于事件循环,而是您想要限制并发数据库查询的数量?如果是这样,您能否共享运行这些查询的代码?您是从
数据
处理程序内部启动它们吗?不,我在.on(“数据”)处理程序中调用了setImmediate。还是堵塞。也许我应该自己尝试使用fs读取csv。可以预料,它仍然会阻塞,
数据被尽可能快地调用,而且它不是异步的。这就是为什么调用
setImmediate
无法解决您的问题。100之后会发生什么?它会跳过其余的吗?不,它应该将并发查询的数量限制为100,但它仍然应该处理所有记录。请注意,
performQuery
应“返回”希望在
data
处理程序中接收的数据。