THPDFCoalescingRandomAccessSource Class
모든 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;
범위 병합
- 캐시 누락이 요청한 바이트를 덮는 정렬된 블록으로 확장되므로, 인접한 파서 읽기가 백킹 스토어 요청 하나를 공유합니다
- 캐시는 전체 바이트, 항목별, 선택적 항목 수 한도를 독립적으로 적용하고, 과도하게 큰 범위는 보유 규칙을 우회합니다
- 적응형 어드미션은 LRU 순서와 상한이 있는 에이징 빈도 스케치를 결합하므로, 콜드 스캔은 더 최근에 쓰인 보유 범위를 교체하지 않고 곧장 읽습니다
- 희소한 소스가 확장된 블록을 제공할 수 없으면 래퍼는 사용 가능한 요청 범위 그대로 폴백합니다
- 소스 접근은 직렬화되므로 기존 서브클래스를 스레드 안전하게 만들 필요는 없습니다
비동기 프리페치와 취소
PrefetchRange는 백그라운드 범위 하나를 예약하고 관련 없는 이전 요청을 대체합니다
활성 범위 밖에서 전경 캐시 누락이 발생하면 소스 잠금을 획득하기 전에 워커를 취소하므로, 협조적 전송 계층이 눈에 보이는 연산에 즉시 양보할 수 있습니다
네트워크나 스토리지 I/O 도중 전달된 THPDFCancellationToken을 검사하려면 THPDFRandomAccessSource.ReadAtCancellable을 재정의하십시오. 상속 구현은 ReadAt 직전과 직후에 취소를 확인합니다
전송 정책이 백그라운드 접근을 금지한다면 AsyncPrefetchEnabled를 False로 설정하세요
적응형 선행 읽기
파서 스트림은 성공한 읽기마다 ObserveReadPattern을 호출합니다. 지속적인 전방 읽기는 선행 읽기 윈도우를 1, 2, 4, 8 블록으로 키우고, 시크나 역방향 접근은 예측 전송을 즉시 억제합니다
SequentialReadToleranceBytes는 작은 전방 간격을 순차 접근으로 간주하며 기본값은 4096바이트입니다. MaxReadAheadBlocks는 적응형 윈도우를 1~32 블록으로 제한하며 기본값은 8입니다
유효 윈도우는 MaxCacheBytes로도 제한되므로 선행 읽기가 설정된 캐시 용량을 넘어설 수 없습니다. 순차 신뢰도는 임의 점프 이후 점진적으로 회복됩니다
비동기 전송을 유지한 채 고정된 한 블록 프리페치를 원한다면 AdaptiveReadAheadEnabled를 False로 설정하세요
통계
TransferAt는 보유 중인 캐시 블록 참조를 획득해 중간 읽기 버퍼를 할당하거나 채우지 않고 곧바로 대상에 기록합니다
THPDFRangeCacheStatistics는 백킹 소스 읽기 횟수와 바이트, 캐시 적중과 누락, 캐시 진입과 거부와 축출, 빈도 기반 진입과 거부와 에이징, 프리페치 요청과 완료와 취소, 순차 및 임의 읽기, 억제된 프리페치, 현재와 최고 선행 읽기 블록, 직접 전송 호출과 바이트, 그리고 현재 캐시된 범위 수와 바이트를 보고합니다
소유권
OwnsSource가 True면 래퍼를 파괴할 때 워커를 취소하고 조인하며, 캐시된 범위를 해제하고, 감싼 소스를 해제합니다