2016-11-30 67 views
-1

私の問題は、viewer.jsでpdfファイルをレンダリングするたびにアプリケーションのメモリ使用量が増加することです。viewer.js/pdf.js:pdfがレンダリングされるたびにメモリ使用量が増加する

私は私のPDFファイルをこのようにレンダリング:

container = document.getElementById('viewerContainer'); 
viewer = document.getElementById('viewer'); 

pdfViewer = new PDFViewer({ 
    container: container, 
    viewer: viewer 
}); 

$scope.pdfFindController = new PDFFindController({ 
     pdfViewer: pdfViewer 
}); 

pdfViewer.setFindController($scope.pdfFindController); 

container.addEventListener('pagesinit', function() { 
    pdfViewer.currentScaleValue = 'page-width';        
}); 

PDFJS.getDocument($scope.getPageLink(pdf)).then(function (pdfDocument) { 
    documentPdf = pdfDocument; 
    pdfViewer.setDocument(pdfDocument);      
}); 

私は別のビューでファイルをレンダリングします。以前のビューに戻って別のファイルを開くと、メモリ使用量が20MB増えます。

私はこの試みた:
documentPdf.destroy(); 

今、メモリ使用量が少し減少したが、それは以前に割り当てられていたではない限り。

解決方法はありますか?

UPDATE

Pdf.jsバージョン:1.6.210

pdf.jsワーカーバージョン:1.6.210

+0

は(一部のブラウザ)があることを行うために彼らのツールを使用してGCに強制することができますガベージコレクションが実行された後、あなたがメモリを測定していることを確認してくださいそれが推奨されます。同じPDFWorkerを使用するには、同じページで複数のドキュメントを使用しようとしていますか? 'documentPdf.destroy();は正しいステップです。setDocumentに同じpdfViewerを再使用しない場合は、pdfFindControllerを含む古いものへのすべての参照をクリーンアップしてください。 – async5

+0

pdfjsプロジェクトから利用可能なangularjsパッケージはありません。完全な例が提供されていない場合や、使用されているパッケージ(ベンダー)が記載されていない場合は、伝えたり再現するのは難しいです。 – async5

+0

Xcodeを使用してメモリ使用量を確認します。私はiOSのためにそれを構築するからです。 PDFWorkerは同じでなければなりません。私は 'PDFJS.workerSrc = 'lib/pdfviewer/pdf.worker.js';'のたびにリファレンスを設定しました。 Giovazz89のような変数を削除して設定しました。 viewer.js /pdf.jsにはまだいくつかの参考文献がありますか?実際には、それらを上書きする必要があり、そのファイル内の文書も破棄します。 1つのファイル内のすべての変数をクリアすることは可能ですか? –

答えて

1

私はdocumentPdf.destroy();を呼び出すことによって、あなたがメモリを解放していないと思いますpdfViewer: 私はpdfViewerを破壊する方法が見つかりませんでしたが、お電話しようとすることができます

delete pdfViewer; 
delete documentPdf; 

プロパティを削除するだけで十分でない場合は、両方をnullに設定できます。

あなたはまだそれが歴史のキャッシュに保存されているHTMLをあなたのメモリを使用していることができ、メモリリークを経験するので、

document.getElementById('viewerContainer').outerHTML = ''; 
空の要素を持つビューアまたはコンテナHTMLを交換しようとする(または完全に削除)した場合

または

container.parentNode.removeChild(container); 
+0

ありがとうございました!残念ながら、メモリはまだ増加します... –

+0

$ scope.pdfFindController変数のイベントを削除しようとしましたか?私はそれが他のオブジェクトのインスタンスを維持していないことを願っています – Giovazz89

+0

'$ scope.pdfFindController = null'と' delete $ scope.pdfFindController'を試しました。 did not work ... 'null'と' undefined'の違いはありますか? –

3

あなたはDocumentPageProxyの約束を破棄メソッドを呼び出す必要があります。

ドキュメントは以下のようにそれを説明します

は、現在のドキュメントのインスタンスを破棄し、労働者を終了します。

出典:https://github.com/mozilla/pdf.js/blob/master/src/display/api.js(ライン621)

destroyメソッドの動作をテストし、現在pdf.jsライブラリ内のいくつかのテストがあります。あなたのケースでは(https://github.com/mozilla/pdf.js/blob/master/test/unit/api_spec.js(ライン86)

のようなもの:。

// a variable to store the callback function 
var loadingTask = PDFJS.getDocument(basicApiUrl); 

... 

// when the document should get destroyed call 
loadingTask.destroy(); 
+0

あなたの答えをありがとう。私がpdf.jsよりはるかに優れたpdf viewerプラグインを使用するため、この問題は私にとっては時代遅れです。https://github.com/sitewaerts/cordova-plugin-document-viewer –

+1

私は同じ問題を抱えていましたが、 pdf.jsで分析しました - あなたの投稿が見つかりましたが、少なくとも私はそれに答えました。時々私は私の個人的な文書のために他の投稿に答えます;) – duffy356

関連する問題