2017-07-26 6 views
1

現在、WebRTCデータチャネルを介してファイルを送信できる電子アプリケーションを作成しています。私は現在WebRTCを抽象化し、開発を容易にする方法としてPeerJSを使用しています。大量のバイナリデータを持つ電子メールのWebRTCでArrayBufferを送信するとメモリリークが発生する

現在の実装では、送信側のFileReaderを使用して、32キロバイトのバイナリチャンクでファイルを読み取ります。これらのチャンクはArrayBufferに入れられ、送信側が送信しているデータを他の側に伝えるためにいくつかのデータと共に送信されます。次に、受信機はバイナリデータをファイルに書き込む。受信機がそのデータを書き込んでいる間、送信機は受信機から「ファイル進行」信号を待つ。受信者が完了すると、送信者は通知を受けて、次のチャンクを送信します。これは、ファイル全体が送信されるまで続きます。

このアプローチは、すべてのファイルがアプリケーションランタイムのコースを送信するまで約500メガバイトに達するまで機能します。これは私が根本的な原因を見つけることができないメモリリークのために私が信じるものです。私が知る限り、私はオブジェクトをメモリに保存せず、GCによってクリアする必要があります。むしろ珍しいことのもう一つは、ファイルの受信者だけがこの問題に苦しんでいるということです。

私のアプリケーションには多くのことが起こっていますが、これは問題の原因と思われる部分です。 (しかし、もっとコードをお願いします)。

これはArrayBufferを書くことになっている部分である。

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は、したがって、ファイル転送関連の関数や変数を保持するオブジェクトであるどこでも「SM」。

ArrayBufferを未定義またはnullに設定しようとしましたが、オブジェクトがメモリから消滅するように見えるものはありません。ファイル転送が完了した後でさえも。ヒープのスナップショットがこれをバックアップしているようです。また、fs.appendFileSync関数を削除してディスクに書き込まないようにしても差はありません。

この問題を解決する方法はありますか?それとも、これはPeerJSに関連する問題ですか?どんな助けや提案も大歓迎です!

答えて

0

結局のところ、PeerJSエラーのようです。 16Kを超えるパケットを送信したい場合、PeerJSはそれらをチャンクします。メモリの問題はチャンクにあります。 PeerJSは16Kでチャンクし、電子(実際にはクロム)は一度に64Kを送信できます。これはブラウザ間の互換性を維持するためですが、厳密に電子を使用しているため、私は32KパケットをチャンクしないようにPeerJSコードを変更しました。これで問題は解決しました。

関連する問題