THotPDF Windowed Local File Mapping
ควบคุม memory mapping แบบอ่านอย่างเดียวที่มีขอบเขต ซึ่ง LoadFromFile ใช้กับเอกสารในเครื่องขนาดใหญ่
การประกาศ
property LocalFileMappingThreshold: Int64;
property LocalFileMappingWindowSize: Integer;
property LocalFileMappingCacheWindows: Integer;
property LocalFileMappingAdaptiveGeometry: boolean;
property LastLoadUsedMemoryMapping: boolean;
function GetLastMappedFileStatistics(
out Statistics: THPDFMappedFileStatistics): boolean;
ค่าเริ่มต้น
| การตั้งค่า | ค่าเริ่มต้น | ความหมาย |
|---|---|---|
LocalFileMappingThreshold | 8 MiB | ขนาดซอร์สขั้นต่ำที่เลือกใช้ memory mapping ค่าศูนย์ปิด mapping |
LocalFileMappingWindowSize | 16 MiB | จำนวน bytes ที่หนึ่ง view ซึ่ง align ตาม allocation granularity ครอบคลุม |
LocalFileMappingCacheWindows | 4 | จำนวน view สูงสุดที่ LRU cache เก็บไว้ |
LocalFileMappingAdaptiveGeometry | True | จัดสรร limit ของ mapped bytes เดิมใหม่เพื่อรองรับการอ่านแบบ sequential หรือ random ต่อเนื่อง |
สถิติ
THPDFMappedFileStatistics = record
FileSize: Int64;
ConfiguredWindowSize: Int64;
ConfiguredCacheWindowCount: Integer;
WindowSize: Int64;
CacheWindowCount: Integer;
MappedByteLimit: Int64;
CurrentMappedBytes: Int64;
PeakMappedBytes: Int64;
GeometryChangeCount: Int64;
SequentialReadCalls: Int64;
RandomReadCalls: Int64;
AdaptiveGeometry: Boolean;
SequentialGeometryActive: Boolean;
RandomGeometryActive: Boolean;
ReadCalls: Int64;
BytesRead: Int64;
MapCount: Int64;
CacheHits: Int64;
FallbackReadCalls: Int64;
FallbackBytes: Int64;
DirectTransferCalls: Int64;
DirectTransferBytes: Int64;
end;
GetLastMappedFileStatistics คืนค่า True เฉพาะเมื่อ LoadFromFile ครั้งล่าสุดเลือกใช้ mapping
MapCount นับ view ใหม่ ส่วน CacheHits นับการอ่านที่ใช้ view เดิม ทำให้แอปและ benchmark ปรับ window geometry ให้เข้ากับรูปแบบการเข้าถึงจริงได้
MappedByteLimit คงที่ ขณะที่ WindowSize กับ CacheWindowCount รายงาน geometry ที่กำลังใช้งาน peak mapped bytes, จำนวน pattern และ mode flags ทำให้การปรับทุกครั้งตรวจสอบได้
ประเภทซอร์สขั้นสูง
THPDFMappedFileSource เป็นเจ้าของ file handle ที่ใช้ร่วมกัน, mapping object, synchronized LRU windows, reference count และเส้นทาง positional fallback
THPDFMappedFileStream เปิด slice แบบ seek ได้ที่มีขอบเขตเหนือซอร์สนั้น ส่วน THPDFMappedFileWindow อธิบาย view ภายในหนึ่งชิ้นที่ถูกแคชไว้
พฤติกรรม
- View จะถูก map เมื่อการอ่านไปถึงช่วงของมันเท่านั้น และถูก evict ตามลำดับ least-recently-used
- การอ้างอิงไปข้างหน้าต่อเนื่อง 8 ครั้งเลือก window แบบ sequential ที่ใหญ่ขึ้น ส่วนการอ้างอิงแบบห่าง ๆ หรือย้อนกลับ 8 ครั้งเลือก window แบบ random access ที่เล็กลงได้ถึง 16 ชิ้น
- Adaptive geometry ไม่เกิน byte limit ที่คำนวณจากขนาดและจำนวน cache ที่ตั้งไว้เด็ดขาด
- การอ่านที่ข้ามขอบ window จะถูกคัดลอกเป็น segment แบบมีขอบเขต โดยไม่สร้าง buffer ขนาดทั้งไฟล์
HPDFTransferStreamเขียน mapped slices ตรงจากแต่ละ window ที่อยู่ในหน่วยความจำ และบันทึก direct transfer calls กับ bytes แยกจากการอ่านของ parser- Parser streams และ lazy PDF stream bodies ที่ไม่ถูกแก้ไขใช้ file handle, mapping object และ window cache แบบ thread-safe ร่วมกัน
- ซอร์สอนุญาตให้ rename หรือลบแบบ atomic ขณะยังใช้งานอยู่ โดย mapping เดิมยังคง view ของ bytes ที่เปิดไว้ให้เสถียร
- ถ้าสร้าง mapping ไม่สำเร็จจะเลือกใช้
TFileStreamแบบเดิม ส่วนการจอง view ที่ล้มเหลวภายหลังจะสลับซอร์สที่ใช้ร่วมกันไปเป็นการอ่านไฟล์แบบ positional ที่ล็อกไว้ - ขนาด window ต่ำกว่า 64 KiB และจำนวน cache นอกช่วง 1 ถึง 32 จะ raise
ERangeError
ดูเพิ่มเติม: LocalFileMappingAdaptiveGeometry, LoadFromFile, Scalable Loading, HPDFTransferStream, LoadedStreamMemoryThreshold