Node.js 如何逐行读取文件而不将整个文件存储在内存中-NodeJS

Node.js 如何逐行读取文件而不将整个文件存储在内存中-NodeJS,node.js,Node.js,我目前有一个csv文件,有130万行。我试图逐行解析这个文件,并在每行上运行一个进程。我遇到的问题是堆内存不足。我在网上读过,并尝试了一系列解决方案,不将整个文件存储到内存中,但似乎没有任何效果。这是我目前的代码: const readLine = createInterface({ input: createReadStream(file), crlfDelay: Infinity }); readLine.on('line', async (line) => { let

我目前有一个csv文件,有130万行。我试图逐行解析这个文件,并在每行上运行一个进程。我遇到的问题是堆内存不足。我在网上读过,并尝试了一系列解决方案,不将整个文件存储到内存中,但似乎没有任何效果。这是我目前的代码:

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
    })
)