Освобождение графов объектов страниц
Крупные последовательные задания могут выбрасывать чистые принадлежащие странице графы объектов после каждой страницы, сохраняя достаточно метаданных источника, чтобы вновь материализовать страницу по требованию
Граница освобождения
ReleaseLoadedPageObjectGraph освобождает выбранный косвенный корень страницы и напрямую владеемые вложенные объекты под ним
Обход не следует по косвенным ссылкам, поэтому общие шрифты, изображения, словари ресурсов, узлы дерева страниц и другие межстраничные объекты остаются во владении загруженного документа
Относящиеся к странице записи display list и растра вытесняются на той же границе
Безопасность и удержание
Грязные, обязательные к записи, активные или иным образом неперезагружаемые страницы удерживаются и фиксируются в статистике, а не выбрасываются
Прямые корни страниц на основе файла перезагружаются по валидированному смещению в cross-reference, а сжатые корни — через индексированный путь к члену object stream
Обычные корни, загруженные из stream или зашифрованные, без независимо воспроизводимого источника остаются резидентными
Последовательная обработка
for PageIndex := 0 to PDF.LoadedPageCount - 1 do
begin
ProcessLoadedPage(PDF, PageIndex);
PDF.ReleaseLoadedPageObjectGraph(PageIndex);
end;
Регрессионная фикстура на 100,000 страниц достигает пика 69.3 MiB на Win32, не показывает роста в установившемся режиме, а затем заново материализует освобождённую страницу с её исходным номером объекта и page boxes
Конкурентность
Доступ к графу загруженного документа по-прежнему сериализует вызывающая сторона
Не освобождайте страницу, пока другой поток рендерит, инспектирует или изменяет тот же экземпляр документа
См. также: ReleaseLoadedPageObjectGraph, GetLoadedPageObjectGraphReleaseStatistics, THPDFPageObjectGraphReleaseStatistics, Lazy Page-Tree Loading, Bounded Object-Stream Cache