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

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

Verwandte APIs