我正在尝试以块的形式加载大型csv文件(GB的大小)。代码如下:
lineReader.open(filename,async function(err, reader) {
if (err) throw err;
var dataArr=[];
while (reader.hasNextLine()) {
reader.nextLine(function(err, line) {
if(err) throw err;
console.log(line);
dataArr.push(csv_parse(line,headers));
});
console.log(dataArr.length);
if(dataArr.length == 3000){
console.log(JSON.stringify(dataArr));
await timeout(6000);
console.log("timeout");
dataArr = [];
}
}
reader.close(function(err) {
if (err) throw err;
});
});
reader.nextline()在第370行之后停止工作,即使while循环正在执行。但是当我移动await外面的代码似乎工作正常。为什么会这样。
答案 0 :(得分:2)
您正在将承诺(async/await
)与回调(reader.nextLine()
)混合,这会导致您的问题。
具体来说,你过早地调用reader.close()
,因为它在读取所有行之前被调用;获得读取的370行可能适合于在文件关闭之前从文件中读取的缓冲区。
一个解决方案是让读取基于承诺的下一行,例如:
const getNextLine = async reader => {
return new Promise((resolve, reject) => {
reader.nextLine(function(err, line) {
if (err) return reject(err);
resolve(line);
});
});
}
lineReader.open(filename, async function(err, reader) {
if (err) throw err;
var dataArr = [];
while (reader.hasNextLine()) {
let line = await getNextLine(reader);
dataArr.push(csv_parse(line, headers));
console.log(dataArr.length);
if (dataArr.length == 3000) {
console.log(JSON.stringify(dataArr));
await timeout(6000);
console.log("timeout");
dataArr = [];
}
}
reader.close(function(err) {
if (err) throw err;
});
});