NodeJS 为什么blob.arrayBuffer不释放已使用的内存?

tmb3ates  于 2023-06-22  发布在  Node.js
关注(0)|答案(1)|浏览(362)

我有一个代码,记录从客户端到服务器的摄像机输入如下:

async function saveIntoMp4(chunks) {
    const options = {
        type: "video/webm"
    }
    let blob = new Blob(chunks, options);
    chunks.length = 0 // to stop any memory leaks
    const buffer = Buffer.from(await blob.arrayBuffer());
    try {
        fs.writeFile(
            `./videos/1.mp4`,
            buffer,
            () => console.log("video is saved!")
        );
    } catch (error) {
        console.log(error)
    }
}

然而,缓冲区占用内存,并没有让它在我的Ubuntu 20.04.6 LTS。每次我运行这个函数,它都会占用越来越多的内存。我没有来自缓冲区或块或blob或任何类型的console.log的示例。我不知道为什么记忆没有释放,我应该做些什么。到目前为止,我已经使用了nodejs版本20和18.9,但没有任何运气。为什么blob.arrayBuffer不释放已使用的内存?

eufgjt7s

eufgjt7s1#

您在代码中遇到的内存未释放的问题可能与Buffer.from()方法的使用有关。在Node.js中,Buffer类表示二进制数据并存储在内存中。当您使用Buffer.from()从blob的arrayBuffer创建一个新的缓冲区时,它会分配内存来保存该数据。
在代码中,每次调用saveIntoMp4()并从blob的arrayBuffer创建新缓冲区时,都会为该缓冲区分配内存。但是,您没有显式地释放或释放该内存,这会导致内存使用量随着时间的推移而累积。
要解决此问题并释放内存,可以使用Buffer.allocUnsafe()方法而不是Buffer.from()来创建缓冲区。allocUnsafe()方法返回一个新的未初始化的缓冲区,然后可以用blob的arrayBuffer填充该缓冲区。下面是代码的更新版本:

async function saveIntoMp4(chunks) {
  const options = {
    type: "video/webm"
  };
  const blob = new Blob(chunks, options);
  chunks.length = 0; // to stop any memory leaks

  const buffer = Buffer.allocUnsafe(await blob.arrayBuffer());
  
  try {
    fs.writeFile(
      `./videos/1.mp4`,
      buffer,
      () => {
        console.log("video is saved!");
        buffer.fill(0); // Optional: Clear the buffer data
      }
    );
  } catch (error) {
    console.log(error);
  }
}

通过使用Buffer.allocUnsafe()而不是Buffer.from(),您可以为缓冲区分配一次内存,并在每次保存视频时重用它。另外,我在fs.writeFile()的回调函数中添加了buffer.fill(0),以便在保存视频后清除缓冲区的数据,从而进一步释放内存。

相关问题