THPDFCoalescingRandomAccessSource Class
Avvolge qualsiasi THPDFRandomAccessSource con caching limitata degli intervalli e prefetch asincrono consapevole della cancellazione
Dichiarazione
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;
Coalescing degli intervalli
- Un cache miss si espande a un blocco allineato che copre i byte richiesti, così le letture adiacenti del parser condividono una sola richiesta alla backing store
- La cache applica limiti indipendenti di byte totali, per voce e opzionalmente di conteggio voci, e un intervallo oversize bypassa la retention
- L'ammissione adattiva combina l'ordine least-recently-used con uno sketch di frequenza limitato e con aging, così le scansioni cold leggono direttamente senza rimpiazzare intervalli retained più caldi
- Quando una sorgente sparsa non può fornire un blocco espanso, il wrapper ripiega sull'intervallo esatto disponibile richiesto
- L'accesso alla sorgente viene serializzato così le sottoclassi esistenti non devono diventare thread safe
Prefetch asincrono e cancellazione
PrefetchRange schedula un intervallo in background e sostituisce una richiesta precedente non correlata
Un cache miss in primo piano fuori dall'intervallo attivo cancella il worker prima di acquisire il lock della sorgente, permettendo a un transport cooperativo di cedere prontamente all'operazione visibile
Fai override di THPDFRandomAccessSource.ReadAtCancellable per ispezionare il THPDFCancellationToken fornito durante l'I/O di rete o storage; l'implementazione ereditata controlla la cancellazione immediatamente prima e dopo ReadAt
Imposta AsyncPrefetchEnabled a False quando la politica del transport vieta l'accesso in background
Read-ahead adattivo
Lo stream del parser chiama ObserveReadPattern dopo ogni lettura riuscita; le letture in avanti sostenute crescono la finestra di read-ahead attraverso 1, 2, 4 e 8 blocchi, mentre un seek o un accesso all'indietro sopprime subito il transport speculativo
SequentialReadToleranceBytes accetta piccoli gap in avanti come accesso sequenziale e vale 4096 byte per default; MaxReadAheadBlocks limita la finestra adattiva da 1 a 32 blocchi con default 8
La finestra effettiva è limitata anche da MaxCacheBytes, quindi il read-ahead non può superare intenzionalmente la capacità di cache configurata; la confidenza sequenziale si recupera gradualmente dopo un salto casuale
Imposta AdaptiveReadAheadEnabled a False per un prefetch fisso a un blocco mantenendo il transport asincrono
Statistiche
TransferAt acquisisce i riferimenti dei blocchi di cache retained e li scrive nella destinazione senza allocare né riempire un buffer di lettura intermedio
THPDFRangeCacheStatistics riporta conteggio e byte delle letture della sorgente di backing, hit e miss della cache, ammissioni, rifiuti ed evizioni della cache, ammissioni, rifiuti e aging per frequenza, richieste, completamenti e cancellazioni di prefetch, letture sequenziali e casuali, prefetch soppressi, blocchi di read-ahead correnti e di picco, chiamate e byte di transfer diretto, più conteggio e byte degli intervalli correnti in cache
Proprietà
Quando OwnsSource è True, distruggere il wrapper cancella e attende il worker, rilascia gli intervalli in cache e libera la sorgente avvolta