【发布时间】:2015-11-01 22:23:07
【问题描述】:
我将其添加为问答 wiki,因为我遇到过几次。
这一次是针对行读取器和处理器,可以从流中逐行馈送大型数组或行。
由于 getLine 会调用 lineHandler,而 lineHandler 会调用 getLine,因此在处理数十万行时,堆栈会变得太大。
为了解决这个问题,我使用 setTimeout 来清除调用堆栈,而不是直接调用函数。下面是一些示例代码:
function startPromise(){
return new Promise(function(resolve,reject){
resolve();
})
}
var lineCount=0;
var totalLines=2000000;
var totalCount=0;
var linesProcessed=0;
function processFile(){console.log('we are done');}
function lineHandler(){
if(linesProcessed%100===0){
console.log('processed:',linesProcessed);
}
lineCount++;
linesProcessed++;
setTimeout(getLine,0);
return;
}
function getLine(){
startPromise()
.then(function(){
if(lineCount>=totalLines){
setTimeout(processFile,0);
return;
}
setTimeout(lineHandler,0);
})
.then(null,function(error){//failed to process this line
console.log('fail:',error);
})
}
getLine();
由于每行有 2 次超时,此代码运行速度非常慢(每秒 100 行)。这太慢了,因为我希望在一小时内处理 1000 万。
【问题讨论】:
-
您的标题未能提出旨在解决问题的问题。相反,您要问的是,当完全不同的解决方案可能会更好时,如何使您提出的解决方案发挥作用。查看更多:XY problem.
标签: node.js recursion stack-overflow settimeout