2016-11-30 1 views
-1

Моя проблема в том, что использование моего приложения в памяти увеличивается каждый раз при рендеринге файла pdf с помощью viewer.js.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);      
}); 

оказывает файл в отдельном окне. Когда я вернусь к своему предыдущему виду и открою другой файл, использование памяти увеличится на ~ 20 МБ.

Я попытался это:

documentPdf.destroy(); 

Теперь, использование памяти уменьшается немного, но не столько, сколько было выделено раньше.

Есть ли решение для этого?

UPDATE:

pdf.js версия: 1.6.210

pdf.js версия работника: 1.6.210

+0

Убедитесь, что вы измеряете памяти после сборки мусора была запущена (Некоторые браузеры могут заставить GC с помощью своих инструментов, чтобы сделать это) Рекомендуется для использования того же файла PDFWorker вы пытаетесь использовать несколько документов на одной странице. 'documentPdf.destroy();' - правильный шаг.Если вы не используете один и тот же файл pdfViewer для setDocument, убедитесь, что вы очищаете все ссылки на старый, включая pdfFindController. – async5

+0

Нет пакета angularjs, доступного из проекта pdfjs. Трудно сказать или воспроизвести, если не указан полный пример или упомянутый пакет (поставщик). – 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 хранится в кэше истории использует вашу память, так что попробуйте заменить зритель или контейнер HTML с пустым элементом (или удалить его полностью)

document.getElementById('viewerContainer').outerHTML = ''; 

или

container.parentNode.removeChild(container); 
+0

Спасибо за ваш ответ! К сожалению, память все еще увеличивается ... –

+0

Вы пытались удалить событие переменной $ scope.pdfFindController? Я надеюсь, что это не keepeng других экземпляров объекта. – Giovazz89

+0

Я пробовал '$ scope.pdfFindController = null' и' delete $ scope.pdfFindController'. Не работает ... Может ли разница между «null» и «undefined»? –

3

Вам нужно вызвать метод уничтожения на обещание DocumentPageProxy.

документация описывает его как следует:

Уничтожает текущий экземпляр документа и завершает рабочий.

Источник: 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

Спасибо за ваш ответ. Сейчас проблема устарела, потому что я буду использовать плагин plugova pdf viewer, который работает намного лучше, чем pdf.js: https://github.com/sitewers/cordova-plugin-document-viewer –

+1

У меня была такая же проблема, и проанализировал его в pdf.js - тогда я нашел ваш пост и, по крайней мере, ответил на него. Иногда я отвечаю на другие сообщения для моей личной документации;) – duffy356