THPDFCoalescingRandomAccessSource Class

Enveloppe n'importe quel THPDFRandomAccessSource avec une mise en cache de plages bornées et une prélecture asynchrone prenant en compte l'annulation

Declaration

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 planifie un arrière-plan pour une plage et remplace une requête précédente sans rapport

Un échec de cache au premier plan hors de la plage active annule le worker avant d'acquérir le verrou de la source, ce qui permet à un transport coopératif de céder rapidement à l'opération visible

Substituez THPDFRandomAccessSource.ReadAtCancellable pour inspecter le THPDFCancellationToken fourni pendant les E/S réseau ou de stockage; l'implémentation héritée vérifie l'annulation immédiatement avant et après ReadAt

Définissez AsyncPrefetchEnabled sur False lorsque la politique de transport interdit l'accès en arrière-plan

Adaptive read-ahead

Le flux de l'analyseur appelle ObserveReadPattern après chaque lecture réussie; les lectures avant continues agrandissent la fenêtre de lecture anticipée à travers 1, 2, 4 et 8 blocs, tandis qu'une recherche ou un accès arrière supprime immédiatement le transport spéculatif

SequentialReadToleranceBytes accepte les petits écarts avant comme un accès séquentiel et a pour défaut 4096 octets; MaxReadAheadBlocks limite la fenêtre adaptative de 1 à 32 blocs et a pour défaut 8

La fenêtre effective est aussi limitée par MaxCacheBytes, donc la lecture anticipée ne peut pas dépasser intentionnellement la capacité de cache configurée; la confiance séquentielle récupère progressivement après un saut aléatoire

Définissez AdaptiveReadAheadEnabled sur False pour une prélecture fixe d'un bloc tout en conservant le transport asynchrone

Statistics

TransferAt acquiert des références aux blocs de cache conservés et les écrit dans la destination sans allouer ni remplir un tampon de lecture intermédiaire

THPDFRangeCacheStatistics signale le nombre de lectures et d'octets de la source de sauvegarde, les succès et échecs de cache, les admissions de cache, rejets et évictions, les admissions, rejets et vieillissements par fréquence, les requêtes de prélecture, achèvements et annulations, les lectures séquentielles et aléatoires, les prélectures supprimées, les blocs de lecture anticipée courants et de pointe, les appels et octets de transfert direct, ainsi que le nombre et les octets de plages mises en cache en cours

Ownership

Lorsque OwnsSource est True, détruire l'enveloppe annule et rejoint son worker, libère les plages mises en cache et libère la source enveloppée

Related APIs