THPDFCoalescingRandomAccessSource Sınıfı
Herhangi bir THPDFRandomAccessSource nesnesini sınırlı range cache'i ve cancellation duyarlı asynchronous prefetch ile sarar
Bildirim
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;
Range coalescing
- Cache miss, istenen byte'ları kapsayan hizalanmış bir bloğa genişler; böylece birbirine komşu parser okumaları tek bir backing-store request'i paylaşır
- Cache; toplam byte, girdi başına ve isteğe bağlı girdi sayısı limitlerini bağımsız uygular, aşırı büyük bir range ise saklama politikasını atlar
- Adaptive admission, en uzun süredir kullanılmayan (LRU) sırayı sınırlı bir aging frequency sketch'iyle birleştirir; böylece soğuk taramalar, daha sıcak saklanan range'leri dışarı atmadan doğrudan okur
- Sparse bir kaynak genişletilmiş bloğu sağlayamadığında wrapper, kullanılabilir durumdaki tam istenen range'e geri döner
- Kaynak erişimi serileştirilir; böylece mevcut alt sınıfların thread safe olması gerekmez
Asynchronous prefetch ve cancellation
PrefetchRange tek bir arka plan range'i planlar ve ilgisiz önceki request'in yerine geçer
Aktif range dışında kalan ön plan cache miss'i, kaynak kilidi alınmadan worker'ı iptal eder; böylece cooperative bir transport, görünür operation'a hızla yol verir
Ağ ya da depolama I/O'su sırasında verilen THPDFCancellationToken'ı incelemek için THPDFRandomAccessSource.ReadAtCancellable'ı override edin; miras alınan implementation, ReadAt'in hemen öncesinde ve sonrasında cancellation'ı kontrol eder
Transport politikası arka plan erişimine izin vermiyorsa AsyncPrefetchEnabled değerini False yapın
Adaptive read-ahead
Parser stream, her başarılı okumanın ardından ObserveReadPattern'i çağırır; sürekli ileri okumalar read-ahead penceresini 1, 2, 4 ve 8 bloğa doğru büyütür, seek ya da geriye dönük erişim ise spekülatif transport'u anında bastırır
SequentialReadToleranceBytes, küçük ileri boşlukları sıralı erişim sayar ve varsayılanı 4096 byte'dır; MaxReadAheadBlocks ise adaptive pencereyi 1 ile 32 blok arasında sınırlar ve varsayılanı 8'dir
Etkin pencere ayrıca MaxCacheBytes ile sınırlıdır; böylece read-ahead, yapılandırılan cache kapasitesini kasıtlı olarak aşamaz; sıralı güven, rastgele bir sıçramadan sonra kademeli olarak toparlanır
Asynchronous transport'ı korurken sabit tek bloklu prefetch için AdaptiveReadAheadEnabled değerini False yapın
İstatistikler
TransferAt, saklanan cache bloğu referanslarını alır ve ara bir okuma buffer'ı ayırmadan ya da doldurmadan hedefe yazar
THPDFRangeCacheStatistics; backing kaynak okuma sayısını ve byte'larını, cache hit ve miss'lerini, cache admission, ret ve eviction'larını, frequency admission, ret ve aging'i, prefetch request'lerini, tamamlanma ve iptalleri, sıralı ve rastgele okumaları, bastırılan prefetch'leri, güncel ve tepe read-ahead bloklarını, doğrudan transfer çağrılarını ve byte'larını, ayrıca güncel cache'lenmiş range sayısını ve byte'larını raporlar
Sahiplik
OwnsSource değeri True iken wrapper yok edildiğinde worker iptal edilip join edilir, cache'lenmiş range'ler serbest bırakılır ve sarılan kaynak serbest bırakılır