Cache Infrastructure
HotPDF は、再利用可能な中間オブジェクト向けの上限付き重みメモリキャッシュと、読み込み済みドキュメントのレンダリングで使用される永続的なレンダリング済みページキャッシュを提供します
重み付きメモリキャッシュ
HPDFCache の THPDFWeightedCache は 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 16 進キーを返します
HPDFCacheKeyOfStream は 2 つ目のフルサイズのバイト配列を確保せずにハッシュし、シーク可能なストリームを位置 0 から読み取り、元の位置を復元します
永続的なレンダリング済みページキャッシュ
各 THotPDF インスタンスは、パースに成功した読み込み済みフォントデコーダをドキュメント単位の重み付き LRU キャッシュに保持します
- 既定の予算は 32 MiB、エントリ数のハードリミットは 128 です。予算 0 バイトで保持を無効化します
- 共有される間接フォントディクショナリは、ページごとにリソース名が違っても、パース済みのコアをページ間で再利用します
- テキスト抽出・SVG エクスポート・読み込み済みテキストの置換・明示的なデコーダ要求は、同じキャッシュを共有します
GetLoadedFontDecoderは管理対象の配列をディープコピーします。呼び出し側がキャッシュされたマッピングや幅を書き換えられないようにするためです- ドキュメントの再読み込み・グラフの変更・ページの無効化・JSON Patch、およびすべての
CMapResourcePathへの代入が、保持されたデコーダをクリアします - デコーダの取得は、1 つのフォントの重複パースを避けるためにドキュメントごとに直列化されます。ただしこのロックは、同時にドキュメントを変更することの安全性まで保証しません
GetLoadedFontDecoderCacheInfoは、エントリ数・推定バイト数・予算・ヒット数・ミス数・パース数・追い出し数・無効化数を公開します
所有権
各 THotPDF インスタンスは、16 個の独立してロックされるメタデータシャードを通じて、読み込み済み画像デコードの再利用を調整します
- キャッシュの参照と登録の間は選択されたシャードだけをロックし、重いフィルタ処理と画像デコードはキャッシュロックの外で実行します
- キーごとの正確な singleflight がオーナーのデコードを 1 つ選び、重複する呼び出し側を同じ完成結果の待ち合わせにします
- 設定された
ImageCacheMaxBytes・エントリ数の上限・エントリごとの上限は、全シャードを通じてグローバルに適用されます - デコード済み画像のエントリは、追い出し後も生き続ける不変の参照カウント付きハンドルを保持します。レンダラは
TBitmapコピーを実体化せずに、キャッシュに残っているヒットを描画できます - 完成した画像は、呼び出し側所有の
TBitmapインスタンスへコピーされます。呼び出し側がキャッシュに保持されたピクセルを書き換えられないようにするためです - ドキュメントの再読み込みと画像キャッシュの無効化は完了済みエントリをクリアします。進行中のフライトオブジェクトは、各自の参照カウント付きの生存期間を保ちます
GetImageDecodeConcurrencyInfoは、実行中のフライト数・実行中とピークのオーナーデコード数・待ち数・完了数・失敗数を報告します
ICC 変換キャッシュ
HPDFICC は、ソースから sRGB への完全な変換をスレッドセーフな 64 MiB の重み付き LRU キャッシュで共有します。設定されていれば proof 用および出力のプロファイルも含みます
- SHA-256 キーは、ソース全体・proof / 出力プロファイルの内容・実効的なレンダリングインテントとブラックポイント補正の設定をカバーします
HPDFGetICCTransformCacheInfoは、ヒット数・ミス数・追い出し数・拒否数・エントリ数・現在のバイト数・最大バイト数を報告しますHPDFSetICCTransformCacheMaxBytesは新しいプロセス全体の予算を直ちに適用し、必要に応じて最も使われていない変換を追い出しますHPDFClearICCTransformCacheは保持された変換を解放してリクエスト統計をリセットします。呼び出し側がすでに保持している変換インターフェースを無効化することはありません
永続フォントサブセットキャッシュ
EnableFontSubsetting が有効な間に再利用可能な TrueType / OpenType サブセット結果を有効化するには THotPDF.FontSubsetCacheFolder を設定します
- キーは、元のフォントバイト列・使用グリフの正確なビットマップ・コンパクト / スパースモード・キャッシュスキーマのバージョンをカバーします
- 通常の GDI フォントストア経路と登録された Unicode フォントファイナライザは、同じキャッシュを再利用します
- コンパクトな PDF/A エントリは、
CIDToGIDMapが必要とする旧 → 新 GID マップと新しいグリフ数を保持します - エントリは使用前に検証され、壊れたエントリは取り除かれます。置き換えには同じディレクトリ内の原子的な移動を使います
FontSubsetCacheMaxBytesは直ちに適用され、無関係なフォルダを走査することなく、最もアクセスが古い正確一致のキャッシュファイルを追い出しますGetFontSubsetCacheInfoは、ヒット数・ミス数・書き込み数・追い出し数・破損数・拒否数・書き込み失敗数・バイト数・ファイル数を報告しますClearFontSubsetCacheは、設定されたフォルダから、フォントサブセットのエントリと放置された一時エントリだけを削除します
PDF.EnableFontSubsetting := True;
PDF.FontSubsetCacheFolder := 'C:\ProgramData\MyApp\HotPDF\FontSubsets';
PDF.FontSubsetCacheMaxBytes := 256 * 1024 * 1024;
永続レンダリングページキャッシュ
THotPDF.RenderCacheFolder を設定すると、メモリ内のレンダリング済みページキャッシュの後段にあたるディスク層が有効になります
- ページファイルは、ドキュメントの内容・ゼロベースのページインデックス・DPI・実効的なオプショナルコンテンツの可視性・カラーインテント・フォールバックポリシーをキーにします
- レイヤーやカラーインテントの変更では、キャッシュ済みのビットマップをすべて捨てるのではなく、再利用可能な状態バリアントを選択します
- PNG とインデックスの更新はアトミックで、放置された一時ファイルは復元の際に削除されます
- ページの読み取りはページレベルの新しさを更新し、ドキュメント数・ページ数・バイト数の上限は、最も使われていないデータを追い出します
- 設定された上限を引き下げると、後の書き込みを待たずに直ちに収束します
- 壊れた PNG ファイル・古いまたは重複したインデックス行・欠落したフォルダ・インデックス化されていないキャッシュフォルダは、自動的に修復されます
- 無効なドキュメントキーや座標は、ファイルシステムへアクセスする前に拒否されます
- リンクされたドキュメントフォルダは、復元・読み取り・書き込み・無効化・追い出しの対象から除外され、リンクとその外部ターゲットファイルは保護されます
シャード化されたロード済み画像のデコードキャッシュ
Putに渡された値はTHPDFWeightedCacheが所有します。Extractが返した値は除きますTHPDFDiskPageCache.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