THPDFCoalescingRandomAccessSource クラス

任意の THPDFRandomAccessSource を、境界付きのレンジ キャッシュとキャンセル対応の非同期プリフェッチで包む

宣言

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;

レンジ合体

非同期プリフェッチとキャンセル

PrefetchRange はひとつのバックグラウンド レンジをスケジュールし、無関係な先行リクエストを置き換える

アクティブなレンジ外のフォアグラウンド キャッシュ ミスは、ソース ロックを取得する前にワーカーをキャンセルし、協調的なトランスポートが可視の操作に速やかに譲れるようにする

ネットワークまたはストレージ I/O 中に供給された THPDFCancellationToken を検査するには THPDFRandomAccessSource.ReadAtCancellable をオーバーライドする。継承された実装は ReadAt の直前と直後にキャンセルを検査する

トランスポートのポリシーがバックグラウンド アクセスを禁止している場合、AsyncPrefetchEnabled を False に設定する

適応型リード アヘッド

パーサー ストリームは、読み取りが成功するたびに ObserveReadPattern を呼び出す。継続的な順方向読み取りは 1、2、4、8 ブロックを通じてリード アヘッド ウィンドウを広げる一方、シークや後方アクセスは即座に投機的な転送を抑制する

SequentialReadToleranceBytes は小さな順方向ギャップを順次アクセスとして受け入れ、デフォルトは 4096 バイト。MaxReadAheadBlocks は適応ウィンドウを 1 ブロックから 32 ブロックまでに制限し、デフォルトは 8

実効ウィンドウは MaxCacheBytes によっても制限されるため、リード アヘッドが意図的に設定済みのキャッシュ容量を超えることはない。順次信頼度はランダムなジャンプの後に徐々に回復する

固定の 1 ブロック プリフェッチにするには、非同期トランスポートを保持したまま AdaptiveReadAheadEnabled を False に設定する

統計

TransferAt は保持済みのキャッシュ ブロック参照を取得し、中間の読み取りバッファを割り当てたり埋めたりせずに宛先へ書き込む

THPDFRangeCacheStatistics は、バックエンド ソースの読み取り回数とバイト数、キャッシュ ヒットとミス、キャッシュのアドミッション、拒否とエビクション、頻度ベースのアドミッション、拒否と陳腐化、プリフェッチ リクエスト、完了とキャンセル、順次読み取りとランダム読み取り、抑制されたプリフェッチ、現在とピークのリード アヘッド ブロック、直接転送の呼び出し回数とバイト数、現在のキャッシュされたレンジ数とバイト数を報告する

所有権

OwnsSource が True の場合、ラッパーの破棄はそのワーカーをキャンセルして結合し、キャッシュされたレンジを解放し、ラップしたソースを解放する

関連 API