Node.js Transform流处理大文件时内存占用一直飙升怎么办?
我在用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用法有问题?
chunk.toString()上,这会把整个 chunk 转成字符串,导致内存飙升。直接用 Buffer 操作可以解决:另外,Vue 那边的 ReadableStream 用法没错,但建议加个
highWaterMark控制缓冲区大小。直接改 Transform 的构造函数参数就行。