2016-11-30 4 views
-1

내 문제는 viewer.js를 사용하여 pdf 파일을 렌더링 할 때마다 내 응용 프로그램의 메모리 사용량이 증가한다는 것입니다.viewer.js/pdf.js : 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);      
}); 

내가 별도의 뷰에서 파일을 렌더링 :

나는 내 PDF 이런 식으로 렌더링합니다. 이전 뷰로 돌아가서 다른 파일을 열면 메모리 사용량이 ~ 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

내가 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'를 시도했습니다. 작동하지 않았습니다 ... 'null'과 'undefined'사이에 차이가있을 수 있습니까? –

3

또는

당신은이 DocumentPageProxy의 약속에 destroy 메소드를 호출해야합니다.

문서는 다음으로 설명

현재 문서 인스턴스를 파기 작업자를 종료한다.

출처 : https://github.com/mozilla/pdf.js/blob/master/src/display/api.js (라인 621)

소멸 메소드의 동작을 테스트 현재 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 뷰어 플러그인을 사용할 것이기 때문에 문제는 지금 나를 위해 쓸모 없다. https://github.com/sitewaerts/cordova-plugin-document-viewer –

+1

나는 같은 문제가 있었다. 그리고 그것을 pdf.js에서 분석했습니다. 그런 다음 귀하의 게시물을 찾았고 최소한 나는 대답했습니다. 때로는 내 개인 문서에 대한 다른 게시물에 응답합니다.) – duffy356