THPDFCoalescingRandomAccessSource Class
Envolve qualquer THPDFRandomAccessSource com cache de intervalos limitada e prefetch assíncrono sensível ao 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;
Range coalescing
- Uma falha na cache expande-se para um bloco alinhado que cobre os bytes pedidos, de modo que leituras adjacentes do parser partilhem um único pedido ao armazenamento de suporte
- A cache impõe limites independentes de total de bytes, de bytes por entrada e, opcionalmente, de número de entradas, e um intervalo demasiado grande dispensa a retenção
- A admissão adaptativa combina a ordem least-recently-used com um sketch de frequência com envelhecimento limitado, pelo que os varrimentos a frio leem diretamente sem substituir intervalos retidos mais quentes
- Quando uma origem esparsa não consegue fornecer um bloco expandido, o wrapper recorre ao intervalo pedido exato que esteja disponível
- O acesso à origem é serializado, para que as subclasses existentes não tenham de passar a ser thread-safe
Asynchronous prefetch and cancellation
PrefetchRange agenda um intervalo em segundo plano e substitui um pedido anterior não relacionado
Uma falha de cache em primeiro plano fora do intervalo ativo cancela o worker antes de adquirir o lock da origem, permitindo que um transporte cooperativo ceda prontamente à operação visível
Faça override de THPDFRandomAccessSource.ReadAtCancellable para inspecionar o THPDFCancellationToken fornecido durante o I/O de rede ou de armazenamento; a implementação herdada verifica o cancelamento imediatamente antes e depois de ReadAt
Definir AsyncPrefetchEnabled para False when transport policy forbids background access
Adaptive read-ahead
O stream do parser chama ObserveReadPattern após cada leitura bem-sucedida; leituras sequenciais em frente prolongadas aumentam a janela de read-ahead para 1, 2, 4 e 8 blocos, enquanto um seek ou um acesso para trás suprime de imediato o transporte especulativo
SequentialReadToleranceBytes aceita pequenos saltos em frente como acesso sequencial e tem por predefinição 4096 bytes; MaxReadAheadBlocks limita a janela adaptativa de 1 a 32 blocos e tem por predefinição 8
A janela efetiva também é limitada por MaxCacheBytes, pelo que o read-ahead não pode ultrapassar intencionalmente a capacidade de cache configurada; a confiança na sequencialidade recupera gradualmente depois de um salto aleatório
Definir AdaptiveReadAheadEnabled para False for fixed one-block prefetch while retaining asynchronous transport
Estatísticas
TransferAt obtém referências para blocos de cache retidos e escreve-os no destino sem alocar nem preencher um buffer de leitura intermédio
THPDFRangeCacheStatistics regista o número de leituras e os bytes da origem de suporte, os acertos e falhas da cache, as admissões, rejeições e remoções da cache, as admissões, rejeições e envelhecimentos por frequência, os pedidos, conclusões e cancelamentos de prefetch, as leituras sequenciais e aleatórias, os prefetches suprimidos, os blocos de read-ahead atuais e de pico, as chamadas e bytes de transferência direta, e ainda o número e os bytes de intervalos atualmente em cache
Propriedade
Quando OwnsSource é True, destruir o wrapper cancela e junta o respetivo worker, liberta os intervalos em cache e liberta a origem envolvida