gpt4 book ai didi

javascript - 在 Electron 中通过 WebRTC 发送带有大量二进制数据的 ArrayBuffer 时出现内存泄漏

转载 作者:行者123 更新时间:2023-11-28 04:22:27 38 4
gpt4 key购买 nike

我目前正在开发一个 Electron 应用程序,需要能够通过 WebRTC 数据通道发送文件。我目前正在使用 PeerJS 作为一种抽象 WebRTC 并使开发更容易的方法。

我当前的实现在发送方使用 FileReader 来读取 32 KB 二进制 block 中的文件。然后这些 block 被放入 ArrayBuffer 中,然后与一些数据一起发送,以告诉另一方发送者正在发送的到底是什么。然后接收器将二进制数据写入文件。当接收方写入数据时,发送方等待来自接收方的“文件继续”信号。当接收方完成后,发送方会收到通知并发送下一个 block 。这一直持续到整个文件发送完毕为止。

此方法一直有效,直到应用程序运行时发送的所有文件达到约 500 MB。我认为这是由于内存泄漏造成的,但我找不到根本原因。据我所知,我不会将对象保存在内存中,它们应该被 GC 清除。另一个相当不寻常的事情是,只有文件的收件人才会遇到此问题。

我的应用程序中发生了很多事情,但是我认为这是问题的原因。 (但请随时索要更多代码)。

这是应该写入ArrayBuffer的部分:

sm.writeChunk = 函数(arrayBuffer) {
sm.receivedBytes += sm.receivedFileMeta.chunkSize;
fs.appendFileSync(sm.downloadsFolder + path.sep + sm.receivedFileMeta.name + '.part' , new Buffer(arrayBuffer , 'binary'), 'binary', function (err) {
如果(错误){
控制台.log(错误);
}
});
sm.onAction({t:'文件进度', 百分比: sm.receivedBytes/sm.receivedFileMeta.size * 100});
sm.dataConnection.send({t: '文件继续'});
};

sm 是一个保存文件传输相关函数和变量的对象,因此称为“sm”。无处不在。

我尝试将 ArrayBuffer 设置为未定义或 null,但似乎没有什么可以使对象从内存中消失。即使文件传输完成后也不会。堆中的快照似乎支持了这一点。另外删除 fs.appendFileSync 函数以使其不写入磁盘也没有什么区别。

我能做些什么来解决这个问题吗?或者这是与 PeerJS 有关的问题?非常感谢任何帮助或建议!

最佳答案

好吧,这毕竟是一个 PeerJS 错误。看来如果你想发送大于 16K 的数据包,PeerJS 将为你分块。内存问题在于分块。 PeerJS block 的大小为 16K,而 Electron(实际上是 chrome)一次可以发送 64K。这是为了保持跨浏览器兼容性,但由于我严格使用 Electron,所以我更改了 PeerJS 代码以不分块我的 32K 数据包。这解决了这个问题。

关于javascript - 在 Electron 中通过 WebRTC 发送带有大量二进制数据的 ArrayBuffer 时出现内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45333734/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com