Инфраструктура кэширования
HotPDF предоставляет ограниченный взвешенный кэш в памяти для повторно используемых промежуточных объектов и постоянный кэш отрендеренных страниц, применяемый при рендеринге загруженных документов
Взвешенный кэш в памяти
THPDFWeightedCache из модуля HPDFCache владеет значениями TObject, индексирует их по ключам AnsiString и вытесняет наименее недавно использовавшиеся значения, пока их суммарный вес не уложится в MaxBytes
GetиTryGetповышают попадание до наиболее недавно использованного и обновляют статистику запросовPeekиContainsKeyпроверяют записи без изменения порядка давности и статистики запросовPutпринимает владение, заменяет существующий ключ на месте и безопасно принимает тот же объект снова, когда изменяется только его весRemoveосвобождает запись, тогда какExtractпередаёт владение вызывающей стороне- Уменьшение
MaxBytesнемедленно вытесняет записи, аTrimToBudgetявно предоставляет ту же операцию сведения к бюджету Hits,Misses,HitRate,Evictions,RejectionsиReplacementsотражают поведение кэша, аResetStatisticsначинает новый интервал измерения- Ёмкость слотов растёт геометрически, а живые записи остаются связанными в порядке давности с постоянным временем доступа
Ключи по содержимому
function HPDFCacheKeyOfBytes(const Bytes: TBytes): AnsiString;
function HPDFCacheKeyOfStream(Stream: TStream): AnsiString;
Обе функции возвращают один и тот же шестнадцатеричный ключ SHA-256 в нижнем регистре для одного и того же содержимого
HPDFCacheKeyOfStream вычисляет хэш без выделения второго полноразмерного массива байтов, читает потоки с возможностью позиционирования с нулевой позиции и восстанавливают их исходную позицию
Постоянный кэш отрендеренных страниц
Задайте THotPDF.RenderCacheFolder, чтобы включить дисковый уровень, используемый после кэша отрендеренных страниц в памяти
- Бюджет по умолчанию — 32 MiB с жёстким лимитом в 128 записей; нулевой байтовый бюджет отключает удержание
- Общие косвенные словари шрифтов переиспользуют один разобранный core между страницами, даже когда страницы используют разные имена ресурсов
- Извлечение текста, SVG-экспорт, замена загруженного текста и явные запросы декодера делят один и тот же кэш
GetLoadedFontDecoderделает управляемые массивы глубокой копией, чтобы вызывающие не могли мутировать кэшированные отображения и ширины- Перезагрузка документа, мутация графа, инвалидация страницы, JSON Patch и каждое
CMapResourcePathприсваивание сбрасывает удерживаемые декодеры - Получение декодера сериализуется на уровне документа, чтобы не разбирать один шрифт дважды, но блокировка не делает конкурентную мутацию документа безопасной
GetLoadedFontDecoderCacheInfoраскрывает число записей, оценочных байтов, бюджет, попадания, промахи, разборы, вытеснения и инвалидации
Шардированный кэш декодирования загруженных изображений
Каждый THotPDF координирует повторное использование декодирования загруженных изображений через 16 шардов метаданных с независимыми блокировками
- Поиск в кэше и допуск удерживают блокировку только выбранного шарда, тогда как дорогая фильтрация и декодирование изображений идут вне кэш-блокировок
- Точный per-key singleflight выбирает одного владельца декодирования и заставляет дублирующих вызывающих ждать тот же готовый результат
- Настроенные
ImageCacheMaxBytes, лимит числа записей и лимит на отдельную запись остаются глобальными для всех шардов - Записи декодированных изображений держат неизменяемые подсчётно-ссылочные хэндлы, которые переживают вытеснение и позволяют рендерерам рисовать тёплые попадания без материализации
TBitmapкопии - Завершённые изображения копируются в принадлежащие вызывающему
TBitmapэкземпляры, чтобы вызывающие не могли мутировать удерживаемые пиксели кэша - Перезагрузка документа и инвалидация кэша изображений очищают завершённые записи, при этом активные flight-объекты сохраняют собственное ссылочно-счётное время жизни
GetImageDecodeConcurrencyInfoсообщает активные flight-ы, активные и пиковые owner-декодирования, ожидания, завершения и отказы
Кэш ICC-преобразований
HPDFICC делит полные преобразования из исходного пространства в sRGB через потокобезопасный взвешенный LRU-кэш на 64 MiB, включая proof- и output-профили, когда они настроены
- Ключ SHA-256 покрывает полное содержимое исходного, proof- и output-профилей, действующий rendering intent и настройку компенсации чёрной точки
HPDFGetICCTransformCacheInfoсообщает попадания, промахи, вытеснения, отказы, число записей, текущие и максимальные байтыHPDFSetICCTransformCacheMaxBytesнемедленно применяет новый бюджет на весь процесс и вытесняет наиболее давно использованные преобразования по мере необходимостиHPDFClearICCTransformCacheосвобождает удерживаемые преобразования и сбрасывает статистику запросов, не инвалидируя интерфейсы преобразований, уже удерживаемые вызывающими
Постоянный кэш сабсетов шрифтов
Задайте THotPDF.FontSubsetCacheFolder, чтобы включить переиспользуемые результаты сабсеттинга TrueType и OpenType, пока EnableFontSubsetting активен
- Ключ покрывает исходные байты шрифта, точную битовую карту использованных глифов, компактный или разреженный режим и версию схемы кэша
- И обычный путь GDI-хранилища шрифтов, и финализатор зарегистрированных Unicode-шрифтов переиспользуют один и тот же кэш
- Компактные PDF/A-записи сохраняют карту old-to-new GID и число новых глифов, нужные
CIDToGIDMap - Записи проверяются перед использованием, повреждённые удаляются, а замена выполняется атомарным переносом в том же каталоге
FontSubsetCacheMaxBytesприменяется немедленно и вытесняет наиболее давно использованные файлы точного кэша, не обходя посторонние каталогиGetFontSubsetCacheInfoсообщает попадания, промахи, записи, вытеснения, повреждения, отказы, сбои записи, байты и файлыClearFontSubsetCacheудаляет из настроенного каталога только записи сабсетов шрифтов и брошенные временные записи
PDF.EnableFontSubsetting := True;
PDF.FontSubsetCacheFolder := 'C:\ProgramData\MyApp\HotPDF\FontSubsets';
PDF.FontSubsetCacheMaxBytes := 256 * 1024 * 1024;
Постоянный кэш отрисованных страниц
Задайте THotPDF.RenderCacheFolder, чтобы включить дисковый ярус, используемый после расположенного в памяти кэша отрисованных страниц
- Файлы страниц ключуются по содержимому документа, нулевому индексу страницы, DPI, действующей видимости optional content, цветовому намерению и политике fallback
- Смена слоя и цветового намерения выбирает переиспользуемые варианты состояния вместо отбрасывания каждого кэшированного битмапа
- Обновления PNG и индекса атомарны, а брошенные временные файлы удаляются при восстановлении
- Чтения страниц освежают свежесть на уровне страницы, а лимиты на число документов, число страниц и байты вытесняют наиболее давно использованные данные
- Уменьшение настроенного лимита сходится немедленно, а не ждёт следующей записи
- Повреждённые PNG-файлы, протухшие или дублирующиеся строки индекса, отсутствующие и неиндексированные каталоги кэша чинятся автоматически
- Неверные ключи документа и координаты отвергаются до обращения к файловой системе
- Связанные папки документов пропускаются при восстановлении, чтении, записи, инвалидации и вытеснении; ссылки и их внешние файлы-цели сохраняются
Владение
THPDFWeightedCacheвладеет значениями, переданными вPut, если только значение не возвращено черезExtractTHPDFDiskPageCache.Lookupвозвращает вновь выделенный растр, принадлежащий вызывающей стороне- Растровые значения, переданные в
THPDFDiskPageCache.Store, остаются во владении вызывающей стороны
Связанные API
- Постоянный кэш сабсетов шрифтов
- THotPDF.LoadedFontDecoderCacheMaxBytes
- THotPDF.GetLoadedFontDecoderCacheInfo
- Шардированный кэш декодирования загруженных изображений
- THotPDF.GetImageDecodeConcurrencyInfo
- THotPDF.RenderCacheFolder
- THotPDF.RenderCacheMaxDocuments
- THotPDF.RenderCacheMaxBytes
- THotPDF.RenderLoadedPageToBitmapCached
- Диагностика rendering и телеметрия операций