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
- Un échec de cache s'étend vers un bloc aligné qui couvre les octets demandés, si bien que les lectures adjacentes de l'analyseur partagent une seule requête au magasin de sauvegarde
- Le cache applique des limites indépendantes d'octets totaux, par entrée et facultativement de nombre d'entrées, et une plage surdimensionnée contourne la rétention
- L'admission adaptative combine l'ordre du moins récemment utilisé avec une esquisse de fréquence de vieillissement bornée, si bien que les balayages à froid lisent directement sans remplacer des plages conservées plus chaudes
- Lorsqu'une source clairsemée ne peut pas fournir un bloc élargi, l'enveloppe retombe sur la plage exacte disponible et demandée
- L'accès à la source est sérialisé, si bien que les sous-classes existantes n'ont pas besoin de devenir thread-safe
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