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

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

APIs relacionadas