Node.js中Buffer内存占用持续增加的原因及解决办法咨询
解决录制视频时的内存占用问题
你的代码核心问题是一次性把整个视频数据加载到内存中——从Blob到ArrayBuffer再到Buffer,整个流程会把所有视频内容暂存到内存里,大视频自然会导致内存暴涨。以下是具体优化方案:
1. 改用流式写入,避免全量加载
不要把所有chunks攒在一起再处理,而是用Node.js的文件流fs.createWriteStream逐块写入,这样每次只处理一小段数据,内存占用会大幅降低:
const fs = require('fs'); async function saveIntoWebm(chunks) { // 注意:你的视频类型是webm,文件名应对应改成.webm(否则播放器可能识别错误) const writeStream = fs.createWriteStream(`./videos/1.webm`); try { // 逐个写入chunk for (const chunk of chunks) { // 把客户端传来的Uint8Array转成Node.js Buffer const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk); writeStream.write(buffer); } // 结束写入流并等待操作完成 writeStream.end(); await new Promise((resolve, reject) => { writeStream.on('finish', resolve); writeStream.on('error', reject); }); console.log("video is saved!"); } catch (error) { console.log('ERROR', error); // 出错时销毁流,避免资源泄漏 writeStream.destroy(); } finally { // 清空chunks数组释放内存 chunks.length = 0; } }
2. 更优方案:直接对接客户端流(如果可能)
如果你的客户端是通过HTTP请求或WebSocket传输视频数据,不要先收集所有chunks到数组里,直接把客户端的流对接文件流,完全避免内存暂存:
比如用Express接收上传的视频流:
const fs = require('fs'); const { pipeline } = require('stream/promises'); const express = require('express'); const app = express(); app.post('/upload-video', async (req, res) => { const writeStream = fs.createWriteStream(`./videos/1.webm`); try { await pipeline(req, writeStream); res.send('Video saved successfully'); } catch (error) { console.error('Upload error:', error); res.status(500).send('Upload failed'); } });
3. 额外注意事项
- 原代码中
type: "video/webm"但文件名是.mp4,这会导致播放器无法正确识别视频格式,务必把文件名改成.webm;如果需要转成MP4,需用ffmpeg等工具处理(转码会占用额外资源,建议优先保存原始格式)。 - 确保每次操作完成后,chunks数组被清空,且没有其他引用持有这些数据,让垃圾回收机制能及时回收内存。
内容的提问来源于stack exchange,提问作者Hypothesis
相关产品推荐
相关产品推荐

