THPDFCoalescingRandomAccessSource Class
Obaluje libovolný THPDFRandomAccessSource ohraničeným kešováním rozsahů a asynchronním přednačítáním citlivým na zrušení
Declaration
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;
Sloučení rozsahů
- Nezásah do keše se rozšíří na zarovnaný blok, který pokrývá požadované bajty, takže sousední čtení parseru sdílí jeden požadavek na úložiště
- Keš vynucuje nezávislé limity celkových bajtů, na záznam a nepovinný počet záznamů, přičemž nadměrný rozsah uchování obchází
- Adaptivní přijetí kombinuje pořadí nejdéle nepoužívaných záznamů s ohraničeným frekvenčním náčrtem stárnutí, takže chladné skeny čtou přímo, aniž by nahrazovaly teplejší uchované rozsahy
- Když řídký zdroj nemůže poskytnout rozšířený blok, obálka přejde přesně na dostupný požadovaný rozsah
- Přístup ke zdroji je serializován, takže stávající podtřídy nemusí být vláknově bezpečné
Asynchronní přednačítání a zrušení
PrefetchRange naplánuje jeden rozsah na pozadí a nahradí nesouvisející dřívější požadavek
Nezásah do keše v popředí mimo aktivní rozsah zruší pracovní vlákno před získáním zámku zdroje, což kooperativnímu transportu umožní rychle ustoupit viditelné operaci
Přepište THPDFRandomAccessSource.ReadAtCancellable, abyste mohli během I/O přes síť nebo úložiště prozkoumat dodaný THPDFCancellationToken; zděděná implementace kontroluje zrušení bezprostředně před ReadAt i po něm
Nastavte AsyncPrefetchEnabled na False, když transportní politika zakazuje přístup na pozadí
Adaptivní předčítání
Stream parseru volá ObserveReadPattern po každém úspěšném čtení; trvalá dopředná čtení zvětšují okno předčítání přes 1, 2, 4 a 8 bloků, zatímco vyhledání nebo čtení dozadu okamžitě potlačí spekulativní transport
SequentialReadToleranceBytes přijímá malé dopředné mezery jako sekvenční přístup a ve výchozím stavu má 4096 bajtů; MaxReadAheadBlocks omezuje adaptivní okno od 1 do 32 bloků a ve výchozím stavu má 8
Efektivní okno je dále omezeno parametrem MaxCacheBytes, takže předčítání nemůže záměrně překročit nakonfigurovanou kapacitu keše; sekvenční jistota se po náhodném skoku obnovuje postupně
Nastavte AdaptiveReadAheadEnabled na False pro pevné předčítání jednoho bloku při zachování asynchronního transportu
Statistika
TransferAt získává odkazy na uchované bloky keše a zapisuje je do cíle bez alokace nebo plnění mezilehlého čtecího bufferu
THPDFRangeCacheStatistics vykazuje počet čtení a bajtů zdrojového úložiště, zásahy a nezásahy keše, přijetí do keše, odmítnutí a vyřazení, frekvenční přijetí, odmítnutí a stárnutí, požadavky přednačítání, jejich dokončení a zrušení, sekvenční a náhodná čtení, potlačená přednačítání, aktuální a špičkový počet bloků předčítání, přímá volání a bajty přenosu plus aktuální počet a velikost kešovaných rozsahů
Vlastnictví
Když je OwnsSource nastaveno na True, zničení obálky zruší a připojí její pracovní vlákno, uvolní kešované rozsahy a uvolní zabalený zdroj