You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 03:05:23