Node.js Transform流处理大文件时内存占用一直飙升怎么办?

Dev · 朱莉 阅读 46

我在用Vue组件上传文件到Node.js后端,想通过Transform流实时处理超大日志文件。但发现内存占用持续上涨,处理500MB文件时直接爆了。

试过设置highWaterMark=1024*1024,还加了setTimeout throttle,但没用。控制台报错说FATAL ERROR: Ineffective mark-compacts

这是我的处理代码:


const processStream = new stream.Transform({
  transform(chunk, enc, cb) {
    // 简单替换敏感词
    const processed = chunk.toString().replace(/password/g, '******');
    this.push(processed);
    cb();
  }
});

// Vue上传组件

  



methods: {
  upload(e) {
    const file = e.target.files[0];
    const reader = new Response(file).body.pipeThrough(processStream);
    fetch('/upload', { method: 'POST', body: reader });
  }
}

难道Transform流会把所有数据缓存?或者Vue这边的ReadableStream用法有问题?

我来解答 赞 6 收藏
二维码
手机扫码查看
1 条解答
程序员建刚
Transform流不会缓存所有数据,但你的问题出在 chunk.toString() 上,这会把整个 chunk 转成字符串,导致内存飙升。直接用 Buffer 操作可以解决:

const processStream = new stream.Transform({
transform(chunk, enc, cb) {
const processed = chunk.toString('utf8').replace(/password/g, '******');
this.push(Buffer.from(processed, 'utf8'));
cb();
}
});


另外,Vue 那边的 ReadableStream 用法没错,但建议加个 highWaterMark 控制缓冲区大小。直接改 Transform 的构造函数参数就行。
点赞 12
2026-01-30 10:12