THPDFCoalescingRandomAccessSource Class
Membungkus setiap THPDFRandomAccessSource dengan caching rentang terbatas dan prefetch asinkron sadar pembatalan
Deklarasi
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;
Penggabungan rentang
- Cache miss meluas ke blok sejajar yang mencakup byte yang diminta, sehingga pembacaan parser yang berdekatan berbagi satu permintaan backing-store
- Cache menegakkan batas total-byte independen, per-entri, dan jumlah-entri opsional, dan rentang yang terlalu besar melewati retensi
- Admission adaptif menggabungkan urutan least-recently-used dengan sketsa frekuensi penuaan terbatas, sehingga pemindaian dingin membaca langsung tanpa mengganti rentang panas yang dipertahankan
- Ketika sumber jarang tidak dapat menyediakan blok yang diperluas, pembungkus kembali ke rentang yang diminta tepat yang tersedia
- Akses sumber diserialkan sehingga subclass yang ada tidak perlu menjadi thread-safe
Prefetch asinkron dan pembatalan
PrefetchRange menjadwalkan satu rentang latar belakang dan mengganti permintaan sebelumnya yang tidak terkait
Cache miss latar depan di luar rentang aktif membatalkan worker sebelum memperoleh kunci sumber, memungkinkan transport kooperatif menyerah segera ke operasi yang terlihat
Timpa THPDFRandomAccessSource.ReadAtCancellable untuk memeriksa THPDFCancellationToken yang diberikan selama I/O jaringan atau penyimpanan; implementasi warisan memeriksa pembatalan tepat sebelum dan sesudah ReadAt
Atur AsyncPrefetchEnabled ke False ketika kebijakan transport melarang akses latar belakang
Read-ahead adaptif
Aliran parser memanggil ObserveReadPattern setelah setiap pembacaan sukses; pembacaan maju berkelanjutan menumbuhkan jendela read-ahead melalui blok 1, 2, 4, dan 8, sementara seek atau akses mundur segera menekan transport spekulatif
SequentialReadToleranceBytes menerima celah maju kecil sebagai akses sekuensial dan default ke 4096 byte; MaxReadAheadBlocks membatasi jendela adaptif dari 1 hingga 32 blok dan default ke 8
Jendela efektif juga dibatasi oleh MaxCacheBytes, sehingga read-ahead tidak dapat secara sengaja melebihi kapasitas cache yang dikonfigurasi; kepercayaan sekuensial pulih secara bertahap setelah lompatan acak
Atur AdaptiveReadAheadEnabled ke False untuk prefetch satu-blok tetap sambil mempertahankan transport asinkron
Statistik
TransferAt memperoleh referensi blok cache yang dipertahankan dan menulisnya ke tujuan tanpa mengalokasikan atau mengisi buffer baca perantara
THPDFRangeCacheStatistics melaporkan jumlah dan byte pembacaan sumber backing, hit dan miss cache, admission cache, penolakan dan eviction, admission frekuensi, penolakan dan penuaan, permintaan prefetch, penyelesaian dan pembatalan, pembacaan sekuensial dan acak, prefetch yang ditekan, blok read-ahead saat ini dan puncak, panggilan dan byte transfer langsung, plus jumlah dan byte rentang cache saat ini
Kepemilikan
Ketika OwnsSource adalah True, menghancurkan pembungkus membatalkan dan bergabung dengan worker-nya, melepaskan rentang cache, dan membebaskan sumber yang dibungkus