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;
レンジ合体
- キャッシュ ミスは要求されたバイトを覆う整列済みブロックへ拡張されるため、隣接するパーサーの読み取りはひとつのバックエンド ストア リクエストを共有する
- キャッシュは独立した総バイト数、エントリごと、任意のエントリ数上限を強制し、超過サイズのレンジは保持をバイパスする
- 適応型のアドミッションは least-recently-used 順序と境界付きの陳腐化周波数スケッチを組み合わせるため、コールド スキャンはホットな保持レンジを置き換えずに直接読み取る
- スパースなソースが拡張ブロックを提供できない場合、ラッパーは正確に利用可能な要求レンジへフォールバックする
- ソースへのアクセスは直列化されるため、既存のサブクラスはスレッドセーフ化する必要がない
非同期プリフェッチとキャンセル
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 の場合、ラッパーの破棄はそのワーカーをキャンセルして結合し、キャッシュされたレンジを解放し、ラップしたソースを解放する