【发布时间】:2014-04-08 11:02:16
【问题描述】:
我无法逐行处理文件列表。这是我正在使用的代码:
var LineReader = require("line-by-line");
var async = require("async");
var files = [ "small.txt", "medium.txt", "large.txt" ];
var queue = async.queue(function(task, next){ console.log(task); next(); }, 10);
async.eachSeries(
files,
function (file, callback) {
var lineReader = new LineReader(file, { encoding: "utf8", skipEmptyLines: true });
lineReader.on("error", function (err) {
callback(err);
});
lineReader.on("line", function (line) {
lineReader.pause();
queue.push(line);
});
queue.drain = function () {
lineReader.resume(); // I need to resume the stream !
callback(); // When all lines have been processed, I need to read the next file
};
},
function (err) {
if (err) return console.log(err);
console.log("Job done.");
}
);
我使用async“同步”处理每个文件并处理队列中的每一行,而line-by-line逐行读取每个文件。
我的问题是:
- 如果我暂停流,将行推入队列并在我收到此错误后恢复流
RangeError: 超出最大调用堆栈大小
- 如果我暂停流,将行推入队列并等待队列为空,我无法恢复流并执行回调
q.drain = function () { lineReader.resume();打回来(); };
我怎样才能等到所有行都被处理并执行回调来处理下一个文件?
谢谢。
更新:
我发现“逐行”模块很奇怪。 “结束”事件被发出两次。所以我决定重构代码,我发现问题出在哪里。另一个问题:模块一年没有更新,1个月前发送了2个拉取请求。
这是我的解决方案(如果逐行有效):
var LineReader = require("line-by-line");
var async = require("async");
var files = [ "small.txt", "medium.txt", "large.txt" ];
var queue = async.queue(function(task, next){ console.log(task); next(); }, 10);
async.eachSeries(
files,
function (file, callback) {
var lineReader = new LineReader(file, { encoding: "utf8", skipEmptyLines: true });
lineReader.on("error", function (err) {
callback(err);
});
lineReader.on("end", function () {
callback();
});
lineReader.on("line", function (line) {
lineReader.pause();
queue.push(line);
});
queue.drain = function () {
lineReader.resume();
};
},
function (err) {
if (err) return console.log(err);
console.log("Job done.");
}
);
使用此解决方案,队列中只有 1 行。如果有人有想法推送超过 1 行然后暂停流。
我会尝试寻找另一个没有这个问题的模块,因为我不想为此重写一个新模块。
【问题讨论】:
标签: node.js asynchronous stream queue large-files