Cache-Infrastruktur
HotPDF bietet einen begrenzten gewichteten Speicher-Cache für wiederverwendbare Zwischenobjekte und einen persistenten Render-Seiten-Cache, der beim Rendern geladener Dokumente verwendet wird
Gewichteter Speicher-Cache
THPDFWeightedCache in HPDFCache besitzt TObject-Werte, indiziert sie über AnsiString und verdrängt die am längsten nicht verwendeten Werte, bis deren kombiniertes Gewicht MaxBytes entspricht
GetundTryGetstufen einen Treffer auf die zuletzt verwendete Position hoch und aktualisieren die AnforderungsstatistikPeekundContainsKeyprüfen Einträge, ohne die Aktualität oder die Anforderungsstatistik zu ändernPutübernimmt den Besitz, ersetzt einen vorhandenen Schlüssel an Ort und Stelle und akzeptiert dasselbe Objekt erneut, wenn sich nur sein Gewicht ändertRemovegibt einen Eintrag frei, währendExtractden Besitz an den Aufrufer überträgt- Eine Reduzierung von
MaxBytesverdrängt Einträge sofort, undTrimToBudgetstellt dieselbe Konvergenzoperation explizit zur Verfügung Hits,Misses,HitRate,Evictions,RejectionsundReplacementsgeben das Cache-Verhalten wieder, währendResetStatisticsein neues Messintervall startet- Die Slot-Kapazität wächst geometrisch und aktive Einträge bleiben in konstanter Aktualitätsreihenfolge verknüpft
Inhaltsschlüssel
function HPDFCacheKeyOfBytes(const Bytes: TBytes): AnsiString;
function HPDFCacheKeyOfStream(Stream: TStream): AnsiString;
Beide Funktionen geben für denselben Inhalt denselben kleingeschriebenen SHA-256-Hexadezimalschlüssel zurück
HPDFCacheKeyOfStream hasht, ohne ein zweites vollgroßes Byte-Array zu allozieren, liest seek-fähige Streams ab Position null und stellt ihre ursprüngliche Position wieder her
Dekoder-Cache für geladene Schriftarten
THotPDF.RenderCacheFolder festlegen, um die Festplattenebene zu aktivieren, die nach dem Speicher-internen Render-Seiten-Cache verwendet wird
- Das Standardbudget liegt bei 32 MiB mit einer harten Grenze von 128 Einträgen; ein Null-Byte-Budget deaktiviert die Rückhaltung
- Geteilte indirekte Font-Wörterbücher nutzen einen geparsten Kern seitenübergreifend wieder, selbst wenn Seiten unterschiedliche Ressourcennamen verwenden
- Textextraktion, SVG-Export, ersetzter Text geladener Dokumente und explizite Dekoder-Anfragen teilen sich denselben Cache
GetLoadedFontDecoderkopiert verwaltete Arrays tief, sodass Aufrufer gecachte Zuordnungen oder Breiten nicht verändern können- Dokument-Neuladen, Graph-Veränderung, Seiteninvalidierung, JSON Patch und jede
CMapResourcePath-Zuweisung löschen gehaltene Dekoder - Die Dekoder-Beschaffung wird pro Dokument serialisiert, um doppeltes Parsen eines Fonts zu vermeiden; die Sperre macht gleichzeitige Dokumentveränderung dennoch nicht sicher
GetLoadedFontDecoderCacheInfolegt Einträge, geschätzte Bytes, Budget, Treffer, Fehltritte, Parsungen, Verdrängungen und Invalidierungen offen
Shard-basierter Dekodier-Cache für geladene Bilder
Jede THotPDF-Instanz koordiniert die Wiederverwendung dekodierter geladener Bilder über 16 unabhängig gesperrte Metadaten-Shards
- Cache-Suche und Aufnahme sperren nur den gewählten Shard, während teure Filter- und Bilddekodierung außerhalb der Cache-Sperren läuft
- Ein exaktes Singleflight pro Schlüssel wählt eine Besitzer-Dekodierung und lässt doppelte Aufrufer auf dasselbe fertige Ergebnis warten
- Das konfigurierte
ImageCacheMaxBytes, die Eintragsanzahl-Grenze und die Grenze pro Eintrag bleiben über alle Shards global - Einträge dekodierter Bilder halten unveränderliche referenzzählte Handles, die Verdrängungen überleben und Renderer warme Treffer zeichnen lassen, ohne eine
TBitmap-Kopie zu materialisieren - Fertige Bilder werden in
TBitmap-Instanzen des Aufrufers kopiert, sodass Aufrufer gehaltene Cache-Pixel nicht verändern können - Dokument-Neuladen und Bild-Cache-Invalidierung löschen fertige Einträge, während aktive Flight-Objekte ihre eigene referenzzählte Lebensdauer behalten
GetImageDecodeConcurrencyInfomeldet aktive Flights, aktive und spitze Besitzer-Dekodierungen, Wartezustände, Abschlüsse und Fehler
ICC-Transformations-Cache
HPDFICC teilt vollständige Quell-zu-sRGB-Transformationen über einen thread-sicheren gewichteten LRU-Cache mit 64 MiB, einschließlich Proof- und Ausgabeprofilen, wenn konfiguriert
- Der SHA-256-Schlüssel deckt die vollständigen Quell-, Proof- und Ausgabeprofilinhalte ab sowie den effektiven Rendering-Intent und die Schwarzpunktkompensations-Einstellung
HPDFGetICCTransformCacheInfomeldet Treffer, Fehltritte, Verdrängungen, Zurückweisungen, Eintragsanzahl, aktuelle Bytes und maximale BytesHPDFSetICCTransformCacheMaxBytessetzt sofort ein neues prozessweites Budget durch und verdrängt bei Bedarf am längsten nicht verwendete TransformationenHPDFClearICCTransformCachegibt gehaltene Transformationen frei und setzt Anfragestatistiken zurück, ohne Transformations-Schnittstellen zu invalidieren, die Aufrufer bereits halten
Persistenter Font-Subset-Cache
Setzen Sie THotPDF.FontSubsetCacheFolder, um wiederverwendbare TrueType- und OpenType-Subset-Ergebnisse zu aktivieren, während EnableFontSubsetting aktiv ist
- Der Schlüssel deckt die originalen Font-Bytes, die exakte Bitmap der verwendeten Glyphen, den kompakten oder sparsamen Modus und die Cache-Schema-Version ab
- Sowohl der normale GDI-Font-Store-Pfad als auch der registrierte Unicode-Font-Finalizer nutzen denselben Cache wieder
- Kompakte PDF/A-Einträge bewahren die Alt-zu-Neu-GID-Map und die neue Glyphenanzahl, die
CIDToGIDMapbenötigt - Einträge werden vor der Verwendung validiert, beschädigte Einträge entfernt, und der Ersatz nutzt ein atomares Verschieben im selben Verzeichnis
FontSubsetCacheMaxBytesgreift sofort und verdrängt die am längsten nicht zugegriffenen exakten Cache-Dateien, ohne nicht beteiligte Ordner zu durchlaufenGetFontSubsetCacheInfomeldet Treffer, Fehltritte, Schreibvorgänge, Verdrängungen, Korruption, Zurückweisungen, Schreibfehler, Bytes und DateienClearFontSubsetCacheentfernt aus dem konfigurierten Ordner nur Font-Subset-Einträge und verwaiste temporäre Einträge
PDF.EnableFontSubsetting := True;
PDF.FontSubsetCacheFolder := 'C:\ProgramData\MyApp\HotPDF\FontSubsets';
PDF.FontSubsetCacheMaxBytes := 256 * 1024 * 1024;
Persistenter Render-Seiten-Cache
THotPDF.RenderCacheFolder festlegen, um die Festplattenebene zu aktivieren, die nach dem Speicher-internen Render-Seiten-Cache verwendet wird
- Seitendateien werden nach Dokumentinhalt, nullbasiertem Seitenindex, DPI, effektiver Sichtbarkeit optionaler Inhalte, Farb-Intent und Fallback-Politik verschlüsselt
- Änderungen an Ebenen und Farb-Intent wählen wiederverwendbare Zustandsvarianten, statt jede gecachte Bitmap zu verwerfen
- PNG- und Indexaktualisierungen sind atomar, und verwaiste temporäre Dateien werden während der Wiederherstellung entfernt
- Seitenlesevorgänge aktualisieren die Aktualität auf Seitenebene, während Dokumentanzahl, Seitenanzahl und Byte-Limits die am längsten nicht verwendeten Daten verdrängen
- Die Reduzierung einer konfigurierten Grenze konvergiert sofort, anstatt auf einen späteren Schreibvorgang zu warten
- Beschädigte PNG-Dateien, veraltete oder doppelte Indexzeilen, fehlende Ordner und nicht indizierte Cache-Ordner werden automatisch repariert
- Ungültige Dokumentschlüssel und Koordinaten werden vor dem Dateisystemzugriff zurückgewiesen
- Verknüpfte Dokumentordner werden während Wiederherstellung, Lese- und Schreibvorgängen, Invalidierung und Verdrängung übersprungen; Links und ihre externen Zieldateien bleiben erhalten
Besitz
THPDFWeightedCachebesitzt die anPutübergebenen Werte, es sei denn, ein Wert wird überExtractzurückgegebenTHPDFDiskPageCache.Lookupgibt eine neu zugeordnete Bitmap zurück, die dem Aufrufer gehört- An
THPDFDiskPageCache.Storeübergebene Bitmap-Werte bleiben im Besitz des Aufrufers
Verwandte APIs
- 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