2017-07-26 101 views
1

我目前正在研究需要能够通过WebRTC数据通道发送文件的电子应用程序。我目前使用PeerJS作为将WebRTC抽象出来并使开发更容易的一种方式。通过WebRTC以电子方式向ArrayBuffers发送大量二进制数据时发生内存泄漏

我目前的实现使用发件人端的FileReader读取32千字节二进制块中的文件。然后将这些块放入一个ArrayBuffer中,然后将这些数据与一些数据一起发送,以告诉另一方发送者正在发送的内容。接收器然后将二进制数据写入文件。当接收器写入数据时,发送者等待接收器发出“文件继续”信号。当接收器完成时,发送者会收到通知并发送下一个块。这一直持续到整个文件被发送。

这种方法的工作原理,直到应用程序运行时间的所有文件发送达到约500兆字节。这是我相信由于内存泄漏,我找不到根本原因。据我所知,我不保存内存中的对象,他们应该由GC清除。另一个非常不寻常的事情是,只有文件的接收者遭受这个问题。

在我的应用程序中有很多事情要做,但这是我认为是问题原因的部分。 (但请随时索取更多代码)。

这是应该写入ArrayBuffer部分:“SM”

sm.writeChunk = function(arrayBuffer) { sm.receivedBytes += sm.receivedFileMeta.chunkSize; fs.appendFileSync(sm.downloadsFolder + path.sep + sm.receivedFileMeta.name + '.part' , new Buffer(arrayBuffer , 'binary'), 'binary', function (err) { if (err) { console.log(err); } }); sm.onAction({t:'file-progress', percent: sm.receivedBytes/sm.receivedFileMeta.size * 100}); sm.dataConnection.send({t: 'file-proceed'}); };

SM是保存文件传输相关的函数和变量因此对象无处不在。

我已经尝试将ArrayBuffer设置为undefined或null,但似乎没有任何东西使内存中的对象消失。即使文件传输完成后也没有。来自堆的快照似乎支持了这一点。另外删除fs.appendFileSync函数以使其不写入磁盘也没有区别。

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

回答

0

好吧,它毕竟似乎是PeerJS错误。看起来,如果你想发送大于16K的数据包,PeerJS会为你分块。记忆问题在于组块。 PeerJS在16K大块,而电子(实际上是铬)可以一次发送64K。这是为了保持跨浏览器的兼容性,但由于我使用严格的电子我更改了PeerJS代码,以不分块我的32K数据包。这解决了这个问题。