Node.js 如何逐行读取文件而不将整个文件存储在内存中-NodeJS
我目前有一个csv文件,有130万行。我试图逐行解析这个文件,并在每行上运行一个进程。我遇到的问题是堆内存不足。我在网上读过,并尝试了一系列解决方案,不将整个文件存储到内存中,但似乎没有任何效果。这是我目前的代码:Node.js 如何逐行读取文件而不将整个文件存储在内存中-NodeJS,node.js,Node.js,我目前有一个csv文件,有130万行。我试图逐行解析这个文件,并在每行上运行一个进程。我遇到的问题是堆内存不足。我在网上读过,并尝试了一系列解决方案,不将整个文件存储到内存中,但似乎没有任何效果。这是我目前的代码: const readLine = createInterface({ input: createReadStream(file), crlfDelay: Infinity }); readLine.on('line', async (line) => { let
const readLine = createInterface({
input: createReadStream(file),
crlfDelay: Infinity
});
readLine.on('line', async (line) => {
let record = parse2(`${line}`, {
delimiter: ',',
skip_empty_lines: true,
skip_lines_with_empty_values: false
});
// Do something with record
index++;
if (index % 1000 === 0) {
console.log(index);
}
});
// halts process until all lines have been processed
await once(readLine, 'close');
一开始很强大,但堆慢慢填满,内存耗尽,程序崩溃。我使用的是readstream,所以我不明白文件为什么会填满堆。尝试使用库csv解析器
摘自:我曾尝试过类似的方法来处理2GB左右的文件,但效果良好
请尝试并让我知道它是否有帮助尝试过它,即确切的代码。堆内存仍然不足。这就是我尝试切换到readline的原因。现在性能越来越差。可能这就是您所寻找的,我的解决方案对您有帮助吗?你还面临着同样的问题吗?事实证明我目前的解决方案确实有效,问题是当我处理记录时,堆被填满了。
const csv = require('csv-parser');
const fs = require('fs');
fs.createReadStream('data.csv')
.pipe(csv())
.on('data', (row) => {
console.log(row);
})
.on('end', () => {
console.log('CSV file successfully processed');
});
var fs = require('fs');
var eventStream = require('event-stream');
fs
.createReadStream('veryLargeFile.txt')
.pipe(eventStream.split())
.pipe(
eventStream
.mapSync(function(line) {
// Do something with record `line`
}).on('error', function(err) {
console.log('Error while reading file.', err);
})
.on('end', function() {
// On End
})
)