Шардированный кэш декодирования загруженных изображений

HotPDF сочетает независимо блокируемые метаданные кэша с точной координацией singleflight по каждому ключу

Параллельная работа

Шестнадцать шартов метаданных ограничивают конкуренцию за блокировки при поиске, добавлении и вытеснении, тогда как дорогостоящее декодирование изображений выполняется вне блокировок кэша

Запросы к разным ключам могут декодироваться параллельно, а среди запросов к одному ключу выбирается единственный владелец, чей готовый результат разделяется между всеми ожидающими вызывающими

Глобальные ограничения

ImageCacheMaxBytes, максимальное число записей и максимальный размер одной записи применяются к суммарному содержимому всех шартов

Обрезка между шардами сохраняет точные настроенные лимиты и не выбирает только что заполненный шард, если запрос на вытеснение может удовлетворить другой шард

Владение и время жизни

AcquireLoadedImageStream и AcquireLoadedImageRegionAtResolution возвращают неизменяемые handle с подсчётом ссылок, поэтому попадания в тёплый кэш и ожидающие singleflight делят декодированные данные без копирования пикселей

Handle остаётся действительным после вытеснения из кэша, инвалидации и уничтожения документа, а CreateBitmapCopy даёт изолированный bitmap во владении вызывающего, когда нужны изменяемые пиксели

Устаревшие методы кэшированного декодирования сохраняют свой контракт с TBitmap во владении вызывающего, материализуя одну копию из handle

Телеметрия

GetImageDecodeConcurrencyInfo раскрывает текущие и накопленные счётчики параллелизма

Счётчики учитывают получения handle, копии compatibility bitmap и скопированные байты, а также активность параллельных владельцев и singleflight

Связанные API

IHPDFDecodedBitmapHandle · AcquireLoadedImageStream · AcquireLoadedImageRegionAtResolution · THPDFImageDecodeConcurrencyInfo