我有一个代码,记录从客户端到服务器的摄像机输入如下:
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不释放已使用的内存?
1条答案
按热度按时间eufgjt7s1#
您在代码中遇到的内存未释放的问题可能与Buffer.from()方法的使用有关。在Node.js中,Buffer类表示二进制数据并存储在内存中。当您使用Buffer.from()从blob的arrayBuffer创建一个新的缓冲区时,它会分配内存来保存该数据。
在代码中,每次调用saveIntoMp4()并从blob的arrayBuffer创建新缓冲区时,都会为该缓冲区分配内存。但是,您没有显式地释放或释放该内存,这会导致内存使用量随着时间的推移而累积。
要解决此问题并释放内存,可以使用Buffer.allocUnsafe()方法而不是Buffer.from()来创建缓冲区。allocUnsafe()方法返回一个新的未初始化的缓冲区,然后可以用blob的arrayBuffer填充该缓冲区。下面是代码的更新版本:
通过使用Buffer.allocUnsafe()而不是Buffer.from(),您可以为缓冲区分配一次内存,并在每次保存视频时重用它。另外,我在fs.writeFile()的回调函数中添加了buffer.fill(0),以便在保存视频后清除缓冲区的数据,从而进一步释放内存。