如何在nodejs中异步读取和处理大型文本文件的每一行?

hgqdbh6s  于 2023-03-17  发布在  Node.js
关注(0)|答案(1)|浏览(131)

我有一个大文件(4百万行,每行120-160个字符),我想处理(替换每行中的一些模式),结果要写入另一个文件。
也许我错了,但是如果我使用readLines(),函数调用将在整个输入文件被读入内存时完成。只有这样我才能处理每一行并将结果写入输出文件。然而,我想要的是在每一行可用时立即处理它并将行结果立即写入输出文件。以准并行方式有效地运行读取和写入,并且同时保持低的存储器占用。
下面的脚本可以进行批量读取吗?或者它实际上可以完成我想要的工作吗?

const { open, readdir } = require ('node:fs/promises')
const srcDir = process.argv[2]
const outDir = path.join( srcDir, 'csv' );

readdir( srcDir ).then( scanFiles )

function scanFiles(files) {
  for (const f of files) {
    if (f.match(/^\d+_\d+\.csv$/)) {
      convertFile(f)
    }
  }
}

async function convertFile(filename) {
  const input = await open(path.join(srcDir, filename))
  const out = await open(path.join(outDir, filename), 'w')
  for await (let line of input.readLines()) {
    await out.write( line.replace(/;/g, ',')+'\n' )
  }
  await out.close()
}
fafcakar

fafcakar1#

实际上,当我在一个包含32个不同大小(3 KB到100+ MB)的文件的目录上启动这个过程时,我可以在进程监视器中看到,内存消耗只增加了大约100 MB,而所有32个文件的转换实际上是并行运行的。
问题已关闭;- )

相关问题