THPDFCoalescingRandomAccessSource Class
Encapsula qualquer THPDFRandomAccessSource com cache de faixa limitado e pré-busca assíncrona ciente de cancelamento
Declaração
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;
Coalescência de faixa
- Uma falta de cache se expande para um bloco alinhado que cobre os bytes solicitados, para que leituras adjacentes do analisador compartilhem uma solicitação de armazenamento de apoio
- O cache impõe limites independentes de bytes totais, por entrada e contagem opcional de entradas, e uma faixa superdimensionada ignora a retenção
- A admissão adaptativa combina ordem menos usada recentemente com um esboço de frequência de envelhecimento limitado, para que varreduras frias leiam diretamente sem substituir faixas retidas mais quentes
- Quando uma fonte esparsa não pode fornecer um bloco expandido, o encapsulador recorre à faixa exata solicitada disponível
- O acesso à fonte é serializado para que subclasses existentes não precisem se tornar seguras para threads
Pré-busca assíncrona e cancelamento
PrefetchRange agenda um trabalho de fundo e substitui uma solicitação anterior não relacionada
Uma falta de cache em primeiro plano fora da faixa ativa cancela o trabalhador antes de adquirir o bloqueio da fonte, permitindo que um transporte cooperativo ceda prontamente à operação visível
Substitua THPDFRandomAccessSource.ReadAtCancellable para inspecionar o THPDFCancellationToken fornecido durante E/S de rede ou armazenamento; a implementação herdada verifica o cancelamento imediatamente antes e depois de ReadAt
Defina AsyncPrefetchEnabled como False quando a política de transporte proibir acesso em segundo plano
Leitura antecipada adaptativa
O fluxo do analisador chama ObserveReadPattern após cada leitura bem-sucedida; leituras diretas sustentadas aumentam a janela de leitura antecipada por meio de 1, 2, 4 e 8 blocos, enquanto uma busca ou acesso para trás suprime imediatamente o transporte especulativo
SequentialReadToleranceBytes aceita pequenas lacunas diretas como acesso sequencial e tem padrão de 4096 bytes; MaxReadAheadBlocks limita a janela adaptativa de 1 a 32 blocos e tem padrão de 8
A janela efetiva também é limitada por MaxCacheBytes, para que a leitura antecipada não possa exceder intencionalmente a capacidade de cache configurada; a confiança sequencial se recupera gradualmente após um salto aleatório
Defina AdaptiveReadAheadEnabled como False para pré-busca fixa de um bloco mantendo o transporte assíncrono
Estatísticas
TransferAt adquire referências de blocos de cache retidos e as grava no destino sem alocar ou preencher um buffer de leitura intermediário
THPDFRangeCacheStatistics relata contagem e bytes de leitura da fonte de apoio, acertos e faltas de cache, admissões, rejeições e remoções de cache, admissões, rejeições e envelhecimento de frequência, solicitações, conclusões e cancelamentos de pré-busca, leituras sequenciais e aleatórias, pré-buscas suprimidas, blocos de leitura antecipada atuais e de pico, chamadas e bytes de transferência direta, além da contagem e bytes atuais de faixas em cache
Propriedade
Quando OwnsSource é True, destruir o encapsulador cancela e une seu trabalhador, libera faixas em cache e libera a fonte encapsulada