Інфраструктура кешування
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 утримує успішно розібрані декодери завантажених шрифтів у зваженому LRU-кеші в межах документа
- Усталений бюджет — 32 МіБ із жорстким лімітом 128 записів, а нульовий бюджет байтів вимикає утримання
- Спільні непрямі словники шрифтів повторно використовують одне розібране ядро крізь сторінки, навіть коли сторінки використовують різні імена ресурсів
- Витяг тексту, експорт SVG, заміна завантаженого тексту та явні запити декодерів спільно використовують той самий кеш
GetLoadedFontDecoderглибоко копіює керовані масиви, тож викликачі не можуть мутувати кешовані відображення чи ширини- Перезавантаження документа, мутація графа, інвалідація сторінки, JSON Patch і кожне призначення
CMapResourcePathочищують утримувані декодери - Отримання декодера серіалізується на документ, щоб уникнути дубльованого розбору одного шрифту, але блокування не робить безпечною конкурентну мутацію документа
GetLoadedFontDecoderCacheInfoвідкриває записи, оцінні байти, бюджет, влучання, промахи, розбори, виселення та інвалідації
Шардований кеш декодування завантажених зображень
Кожен примірник THotPDF координує повторне використання декодування завантажених зображень через 16 незалежно заблокованих метаданих-шардів
- Пошук у кеші та прийом утримують лише обраний шард, тоді як дорогe декодування фільтрів і зображень виконується поза блокуваннями кешу
- Точний singleflight на ключ обирає одного власника декодування і змушує дублюючих викликачів чекати того самого завершеного результату
- Налаштовані
ImageCacheMaxBytes, ліміт кількості записів і ліміт на запис залишаються глобальними для всіх шардів - Записи декодованих зображень утримують незмінні лічильно-посилальні дескриптори, які переживають виселення і дозволяють рендерерам малювати теплі влучання без матеріалізації копії
TBitmap - Завершені зображення копіюються у належні викликачу примірники
TBitmap, тож викликачі не можуть мутувати утримувані пікселі кешу - Перезавантаження документа та інвалідація кешу зображень очищують завершені записи, тоді як активні об'єкти в польоті утримують власний лічильно-посилальний час життя
GetImageDecodeConcurrencyInfoповідомляє активні польоти, активні та пікові декодування власників, очікування, завершення та невдачі
Кеш ICC-перетворень
HPDFICC поділяє повні перетворення джерело-в-sRGB через потокобезпечний зважений LRU-кеш 64 МіБ, включно з proof- і вихідними профілями, коли їх налаштовано
- Ключ SHA-256 покриває повний вміст джерела, proof- і вихідного профілів, ефективний намір рендерингу та налаштування компенсації чорної точки
HPDFGetICCTransformCacheInfoповідомляє влучання, промахи, виселення, відхилення, кількість записів, поточні та максимальні байтиHPDFSetICCTransformCacheMaxBytesнегайно застосовує новий бюджет на весь процес і за потреби виселяє найменш нещодавно використані перетворенняHPDFClearICCTransformCacheзвільняє утримувані перетворення і скидає статистику запитів, не роблячи недійсними інтерфейси перетворень, уже утримувані викликачами
Постійний кеш підмножин шрифтів
Установіть THotPDF.FontSubsetCacheFolder, щоб увімкнути багаторазові результати підмножин TrueType і OpenType, поки активний EnableFontSubsetting
- Ключ покриває початкові байти шрифту, точну бітову карту використаних гліфів, компактний чи розріджений режим і версію схеми кешу
- І звичайний шлях сховища шрифтів GDI, і фіналізатор зареєстрованих Unicode-шрифтів використовують той самий кеш
- Компактні записи PDF/A зберігають карту старий-новий GID і нову кількість гліфів, потрібні для
CIDToGIDMap - Записи перевіряються перед використанням, пошкоджені записи вилучаються, а заміна використовує атомарне переміщення в тому самому каталозі
FontSubsetCacheMaxBytesзастосовується негайно та виселяє найменш нещодавно доступані точні файли кешу, не обходячи сторонні каталогиGetFontSubsetCacheInfoповідомляє влучання, промахи, записи, виселення, пошкодження, відхилення, невдачі запису, байти та файлиClearFontSubsetCacheвилучає лише записи підмножин шрифтів і покинуті тимчасові записи з налаштованого каталогу
PDF.EnableFontSubsetting := True;
PDF.FontSubsetCacheFolder := 'C:\ProgramData\MyApp\HotPDF\FontSubsets';
PDF.FontSubsetCacheMaxBytes := 256 * 1024 * 1024;
Постійний кеш відрендерених сторінок
Установіть THotPDF.RenderCacheFolder, щоб увімкнути дисковий рівень, що використовується після кешу відрендерених сторінок у пам'яті
- Файли сторінок ключуються вмістом документа, нульованим індексом сторінки, DPI, ефективною видимістю необов'язкового вмісту, колірним наміром і політикою резервування
- Зміни шарів і колірного наміру обирають придатні для повторного використання варіанти стану замість відкидання кожного кешованого бітмапа
- Оновлення PNG та індексу є атомарними, а покинуті тимчасові файли вилучаються під час відновлення
- Зчитування сторінок оновлює рекурсію на рівні сторінки, тоді як кількість документів, кількість сторінок і ліміти байтів витискають найдавніше використані дані
- Зменшення налаштованого ліміту збігається негайно, замість очікування пізнішого запису
- Пошкоджені PNG-файли, застарілі або дубльовані рядки індексу, відсутні теки та неіндексовані теки кешу відновлюються автоматично
- Некоректні ключі та координати документа відхиляються до доступу до файлової системи
- Пов'язані теки документів пропускаються під час відновлення, зчитувань, записів, інвалідації та виселення; посилання та їхні зовнішні цільові файли зберігаються
Володіння
THPDFWeightedCacheволодіє значеннями, переданими доPut, якщо значення не повернуто черезExtractTHPDFDiskPageCache.Lookupповертає щойно виділений растровий об'єкт, яким володіє виклик- Растрові значення, передані до
THPDFDiskPageCache.Store, залишаються у володінні виклику
Пов'язані API
- Persistent Font-Subset Cache
- THotPDF.LoadedFontDecoderCacheMaxBytes
- THotPDF.GetLoadedFontDecoderCacheInfo
- Sharded Loaded-Image Decode Cache
- THotPDF.GetImageDecodeConcurrencyInfo
- THotPDF.RenderCacheFolder
- THotPDF.RenderCacheMaxDocuments
- THotPDF.RenderCacheMaxBytes
- THotPDF.RenderLoadedPageToBitmapCached
- Rendering Diagnostics and Operation Telemetry