Node.js大文件压缩优化实战:如何用流式处理避免内存泄漏
最近在项目中遇到一个棘手问题:当使用archiver压缩几个GB的日志文件时,Node.js进程内存占用直接飙到上限然后崩溃。排查后发现是流式处理不当导致的内存泄漏,这也是许多中高级开发者常踩的坑。今天我们就来深度剖析archiver的流处理机制,分享几种经过实战验证的优化方案。
1. 为什么你的archiver会内存泄漏?
先看一个典型的内存泄漏案例:
javascript复制const archive = archiver('zip');
archive.pipe(fs.createWriteStream('output.zip'));
// 危险操作:直接读取大文件到内存
const data = fs.readFileSync('huge-file.log');
archive.append(data, { name: 'file.log' });
archive.finalize();
这种写法会把整个文件内容加载到内存,当文件大于Node.js默认内存限制时就会崩溃。其根本原因在于没有正确利用Node.js的流式处理能力。
1.1 archiver的三种数据输入方式对比
| 输入方式 | 内存占用 | 适用场景 | 风险提示 |
|---|---|---|---|
fs.readFileSync |
高 | 小文件(<10MB) | 大文件会导致OOM |
fs.createReadStream |
低 | 大文件 | 需正确处理流事件 |
archive.file() |
最低 | 文件路径已知 | 内部自动处理流 |
关键发现:archive.append(buffer)的内存开销是archive.file()的3-5倍(实测2GB文件前者占用2.1GB内存,后者仅400MB)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
