THPDFCoalescingRandomAccessSource Class
Umschließt jede THPDFRandomAccessSource mit begrenztem Bereichs-Caching und abbrechbarer asynchroner Vorabfrage
Deklaration
constructor Create(
ASource: THPDFRandomAccessSource;
OwnsSource: Boolean = False;
BlockSize: Integer = 262144;
MaxCacheBytes: Int64 = 2097152;
MaxEntryBytes: Int64 = 0;
MaxCacheEntries: Integer = 0;
AdaptiveAdmission: Boolean = True);
procedure PrefetchRange(Offset, Count: Int64);
procedure ObserveReadPattern(Offset: Int64; Count: Integer);
function TransferAt(Offset, Count: Int64;
Destination: TStream): Int64;
procedure CancelPrefetch;
function IsPrefetchActive: Boolean;
procedure ClearCache;
procedure ConfigureCacheAdmission(MaxCacheBytes,
MaxEntryBytes: Int64; MaxCacheEntries: Integer;
AdaptiveAdmission: Boolean = True);
procedure GetStatistics(out Statistics: THPDFRangeCacheStatistics);
property BlockSize: Integer;
property MaxCacheBytes: Int64;
property MaxEntryBytes: Int64;
property MaxCacheEntries: Integer;
property AdaptiveAdmissionEnabled: Boolean;
property AsyncPrefetchEnabled: Boolean;
property AdaptiveReadAheadEnabled: Boolean;
property MaxReadAheadBlocks: Integer;
property SequentialReadToleranceBytes: Integer;
Bereich-Coalescing
- Ein Cache-Miss wird auf einen ausgerichteten Block erweitert, der die angeforderten Bytes abdeckt, sodass zusammenhängende Parser-Lesezugriffe eine gemeinsame Backing-Store-Anfrage nutzen
- Der Cache erzwingt voneinander unabhängige Grenzen für Gesamtbytes, Einträge und optional die Eintragsanzahl, und ein übermäßig großer Bereich umgeht die Aufnahme
- Adaptive Aufnahme kombiniert die Least-Recently-Used-Reihenfolge mit einem begrenzten Skizzen-Sketch zur Altersbestimmung, sodass kalte Scans direkt lesen, ohne wärmere gehaltene Bereiche zu verdrängen
- Wenn eine spärliche Quelle keinen erweiterten Block bereitstellen kann, greift der Wrapper auf den exakt verfügbaren angeforderten Bereich zurück
- Der Quellenzugriff wird serialisiert, damit bestehende Unterklassen nicht threadsicher werden müssen
Asynchrone Vorabfrage und Abbruch
PrefetchRange plant einen Hintergrundbereich und ersetzt eine unabhängige frühere Anfrage
Ein Vordergrund-Cache-Miss außerhalb des aktiven Bereichs bricht den Worker ab, bevor er die Quellensperre erwirbt, sodass ein kooperativer Transport prompt an die sichtbare Operation abgeben kann
Überschreiben Sie THPDFRandomAccessSource.ReadAtCancellable, um das übergebene THPDFCancellationToken während Netzwerk- oder Speicher-I/O zu prüfen; die geerbte Implementierung prüft den Abbruch direkt vor und nach ReadAt
Setzen Sie AsyncPrefetchEnabled auf False, wenn die Transportrichtlinie Hintergrundzugriffe verbietet
Adaptives Vorauslesen
Der Parser-Stream ruft nach jedem erfolgreichen Lesezugriff ObserveReadPattern auf; anhaltende Vorwärtslesevorgänge vergrößern das Vorauslesefenster schrittweise über 1, 2, 4 und 8 Blöcke, während ein Seek oder Rückwärtszugriff spekulativen Transport sofort unterdrückt
SequentialReadToleranceBytes akzeptiert kleine Vorwärtslücken als sequenziellen Zugriff und beträgt standardmäßig 4096 Bytes; MaxReadAheadBlocks begrenzt das adaptive Fenster auf 1 bis 32 Blöcke und beträgt standardmäßig 8
Das wirksame Fenster wird zusätzlich durch MaxCacheBytes begrenzt, sodass Vorauslesen die konfigurierte Cacherate nicht vorsätzlich überschreitet; das sequenzielle Vertrauensniveau erholt sich nach einem zufälligen Sprung allmählich
Setzen Sie AdaptiveReadAheadEnabled auf False für festes Ein-Block-Vorauslesen bei beibehaltenem asynchronem Transport
Statistik
TransferAt holt Referenzen auf gehaltene Cache-Blöcke und schreibt sie direkt in das Ziel, ohne einen Zwischen-Lesepuffer zu allozieren oder zu füllen
THPDFRangeCacheStatistics meldet Leseanzahl und Bytes der Backing-Quelle, Cache-Hits und Misses, Cache-Aufnahmen, Ablehnungen und Verdrängungen, Frequenz-Aufnahmen, Ablehnungen und Alterung, Vorabfrage-Anfragen, Fertigstellungen und Abbruch, sequenzielle und zufällige Lesezugriffe, unterdrückte Vorabfragen, aktuelle und maximale Vorausleseblöcke, direkte Transferaufrufe und Bytes sowie aktuelle Anzahl und Bytes der gecachten Bereiche
Eigentum
Wenn OwnsSource den Wert True hat, bricht die Zerstörung des Wrappers den Worker ab und verbindet ihn, gibt gecachte Bereiche frei und gibt die umschlossene Quelle frei