2017-07-26 30 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數據包。這解決了這個問題。