โครงสร้างพื้นฐานแคช
HotPDF ให้แคชหน่วยความจำแบบมีขอบเขต บวกแคชแบบคงอยู่สำหรับ font subset ที่ใช้ซ้ำได้กับหน้าที่เรนเดอร์แล้ว
แคชหน่วยความจำแบบถ่วงน้ำหนัก
THPDFWeightedCache ใน HPDFCache เป็นเจ้าของค่า TObject, index ด้วย AnsiString และ evict ค่าที่ใช้ล่าสุดนานที่สุดออกไปจนน้ำหนักรวมพอดี MaxBytes
GetและTryGetจะเลื่อนรายการที่ฮิตเป็นรายการใช้ล่าสุด พร้อมอัปเดตสถิติการร้องขอPeekและContainsKeyตรวจดูรายการโดยไม่เปลี่ยนลำดับความใหม่หรือสถิติการร้องขอPutรับความเป็นเจ้าของ แทนที่คีย์ที่มีอยู่แทนในที่เดิม และยอมรับ object เดิมซ้ำได้อย่างปลอดภัยเมื่อเปลี่ยนแค่น้ำหนักRemoveปล่อยรายการ ส่วนExtractโอนความเป็นเจ้าของให้ผู้เรียก- ลด
MaxBytesจะไล่รายการออกทันที และTrimToBudgetเปิดให้เรียก operation ลู่เข้าชุดเดียวกันนี้อย่างชัดเจน Hits,Misses,HitRate,Evictions,RejectionsและReplacementsเปิดดูพฤติกรรมของแคช ส่วนResetStatisticsเริ่มช่วงวัดใหม่- ความจุ slot โตแบบเรขาคณิต และรายการที่ยังมีชีวิตถูกโยงกันตามลำดับความใหม่แบบคงที่
คีย์ของเนื้อหา
function HPDFCacheKeyOfBytes(const Bytes: TBytes): AnsiString;
function HPDFCacheKeyOfStream(Stream: TStream): AnsiString;
ทั้งสอง function คืน key hex SHA-256 ตัวพิมพ์เล็กเดียวกันสำหรับเนื้อหาชุดเดิม
HPDFCacheKeyOfStream hash โดยไม่จอง byte array เต็มขนาดครั้งที่สอง อ่าน stream แบบ seek ได้จากตำแหน่งศูนย์ แล้วคืนตำแหน่งเดิมของมัน
แคชตัวถอดรหัสฟอนต์ที่โหลดแล้ว
instance THotPDF แต่ละตัวคง decoder ของฟอนต์ที่โหลดแล้วซึ่ง parse ผ่าน เก็บไว้ใน LRU cache แบบถ่วงน้ำหนักระดับเอกสาร
- งบประมาณ default คือ 32 MiB พร้อม hard limit 128 รายการ งบประมาณศูนย์ไบต์จะปิดการเก็บรักษา
- font dictionary indirect ที่ใช้ร่วมกันจะใช้ parsed core เดียวกันข้ามหน้า แม้แต่ละหน้าเรียกรีซอร์สคนละชื่อ
- การดึงข้อความ, ส่งออก SVG, แทนข้อความในเอกสารที่โหลดไว้ และการขอตัวถอดรหัสแบบชัดเจน ใช้แคชชุดเดียวกัน
GetLoadedFontDecoderคัดลอกแบบ deep copy ให้กับ managed array เพื่อไม่ให้ผู้เรียกแก้ไข mapping หรือความกว้างที่แคชไว้- การโหลดเอกสารใหม่ การแก้ graph, การ invalidate หน้า, JSON Patch และการตั้ง
CMapResourcePathทุกครั้ง จะล้างตัวถอดรหัสที่ถือไว้ - การขอตัวถอดรหัสถูกจัดลำดับต่อเอกสาร เพื่อไม่ให้ parse ฟอนต์เดียวกันซ้ำ แต่ล็อกนี้ไม่ได้ทำให้การแก้เอกสารพร้อมกันปลอดภัย
GetLoadedFontDecoderCacheInfoเปิดดูรายการ ไบต์โดยประมาณ งบประมาณ hit, miss, การ parse, การไล่ออก และการทำให้ใช้ไม่ได้
แคชถอดรหัสรูปภาพที่โหลดแล้วแบบ sharded
instance THotPDF แต่ละตัวจัดการการใช้ decode รูปที่โหลดซ้ำผ่าน metadata shard 16 ชาร์ดที่ lock เป็นอิสระต่อกัน
- การ lookup และรับรายการเข้าแคชล็อกเฉพาะ shard ที่เลือก ส่วนการถอดรหัส filter และรูปภาพที่แพง ทำงานนอกล็อกแคช
- singleflight ต่อคีย์แบบเป๊ะ ๆ จะเลือกเจ้าของการถอดรหัสหนึ่งตัว และให้ผู้เรียกที่ซ้ำกันรอผลลัพธ์ชุดเดียวกันจนเสร็จ
ImageCacheMaxBytesที่ตั้งไว้ ลิมิตจำนวนรายการ และลิมิตรายรายการ เป็นค่า global ข้ามทุก shard- รายการรูปที่ถอดรหัสแล้วถือ immutable handle แบบนับ reference ที่รอดจากการไล่ออก ทำให้ renderer วาด warm hit ได้โดยไม่ต้องสร้างสำเนา
TBitmap - รูปที่ถอดรหัสเสร็จถูกคัดลอกลง
TBitmapที่ผู้เรียกเป็นเจ้าของ ผู้เรียกจึงแก้พิกเซลที่แคชถือไว้ไม่ได้ - การโหลดเอกสารใหม่และการ invalidate แคชรูปจะล้างรายการที่เสร็จแล้ว ขณะที่ object ของงานที่กำลังบินยังถืออายุแบบนับ reference ของตัวเอง
GetImageDecodeConcurrencyInfoรายงานงานที่กำลังทำ การถอดรหัสของเจ้าของที่กำลังทำและพีคสุด การรอ การเสร็จสิ้น และความล้มเหลว
แคชการแปลง ICC
HPDFICC แชร์ transform จาก source ไป sRGB แบบเต็มผ่าน LRU cache แบบถ่วงน้ำหนัก 64 MiB ที่ปลอดภัยต่อเธรด รวม profile ของ proof กับ output เมื่อตั้งค่าไว้
- คีย์ SHA-256 ครอบคลุมเนื้อหาของ source, proof และ output profile ครบ, rendering intent ที่มีผล และการตั้งค่า black-point compensation
HPDFGetICCTransformCacheInfoรายงาน hit, miss, การไล่ออก, การปฏิเสธ, จำนวนรายการ ไบต์ปัจจุบัน และไบต์สูงสุดHPDFSetICCTransformCacheMaxBytesบังคับใช้งบประมาณใหม่ทั้ง process ทันที และไล่ transform ที่ไม่ได้ใช้นานที่สุดออกตามความจำเป็นHPDFClearICCTransformCacheปล่อย transform ที่ถือครองไว้และรีเซ็ตสถิติการร้องขอ โดยไม่ทำให้ transform interface ที่ผู้เรียกถืออยู่ใช้ไม่ได้
แคช font-subset ถาวร
ตั้ง THotPDF.FontSubsetCacheFolder เพื่อเปิดผล subset แบบ TrueType กับ OpenType ที่ใช้ซ้ำได้ ขณะที่ EnableFontSubsetting ทำงานอยู่
- คีย์ครอบคลุมไบต์ฟอนต์ต้นฉบับ, bitmap glyph ที่ใช้แบบเป๊ะ, โหมด compact หรือ sparse และเวอร์ชัน schema ของแคช
- ทั้งเส้นทาง font store ผ่าน GDI ปกติและ finalizer ของฟอนต์ Unicode ที่ลงทะเบียนไว้ ใช้แคชเดียวกัน
- รายการแบบกะทัดรัดของ PDF/A เก็บแมป GID เก่าไปใหม่และจำนวน glyph ใหม่ที่
CIDToGIDMapต้องใช้ - รายการถูกตรวจก่อนใช้ รายการเสียถูกลบ และการแทนที่ใช้การย้ายแบบ atomic ภายในไดเรกทอรีเดียวกัน
FontSubsetCacheMaxBytesมีผลทันทีและไล่ไฟล์แคชที่ไม่ได้ถูกเข้าถึงนานที่สุดออก โดยไม่ต้องไล่โฟลเดอร์อื่นที่ไม่เกี่ยวข้องGetFontSubsetCacheInfoรายงาน hit, miss, การเขียน, การไล่ออก, ความเสียหาย, การปฏิเสธ, ความล้มเหลวในการเขียน, จำนวนไบต์ และจำนวนไฟล์ClearFontSubsetCacheลบเฉพาะรายการ font subset และไฟล์ชั่วคราวที่ถูกทิ้งร้างจากโฟลเดอร์ที่ตั้งค่าไว้
PDF.EnableFontSubsetting := True;
PDF.FontSubsetCacheFolder := 'C:\ProgramData\MyApp\HotPDF\FontSubsets';
PDF.FontSubsetCacheMaxBytes := 256 * 1024 * 1024;
แคชหน้าที่เรนเดอร์แล้วแบบถาวร
ตั้ง THotPDF.RenderCacheFolder เพื่อเปิดชั้นดิสก์ที่ใช้ต่อจากแคชหน้าที่เรนเดอร์แล้วในหน่วยความจำ
- ไฟล์หน้าถูกกำหนดคีย์จากเนื้อหาเอกสาร ดัชนีหน้าเริ่มที่ศูนย์, DPI, การมองเห็น optional content ที่มีผลจริง, colour intent และนโยบาย fallback
- การเปลี่ยนเลเยอร์และ colour intent จะเลือก variant ของ state ที่ใช้ซ้ำได้ แทนการทิ้ง bitmap ที่แคชไว้ทั้งหมด
- PNG และการอัปเดตดัชนีเป็น atomic และไฟล์ชั่วคราวที่ถูกทิ้งร้างจะถูกลบระหว่างกู้คืน
- การอ่านหน้าจะรีเฟรชความใหม่ระดับหน้า ส่วนลิมิตจำนวนเอกสาร จำนวนหน้า และไบต์ จะไล่ข้อมูลที่ไม่ได้ใช้นานที่สุดออก
- ลดลิมิตที่ตั้งไว้จะลู่เข้าทันที ไม่ต้องรอการเขียนครั้งหน้า
- ไฟล์ PNG เสีย, แถวดัชนีเก่าหรือซ้ำ, โฟลเดอร์ที่หายไป และโฟลเดอร์แคชที่ไม่ถูก index จะถูกซ่อมอัตโนมัติ
- คีย์เอกสารและพิกัดที่ไม่ถูกต้องถูกปฏิเสธก่อนแตะระบบไฟล์
- โฟลเดอร์เอกสารที่เป็น link ถูกข้ามตลอดการกู้คืน การอ่าน การเขียน การ invalidate และการไล่ออก ทั้ง link และไฟล์ปลายทางภายนอกของมันถูกเก็บไว้ครบ
ความเป็นเจ้าของ
THPDFWeightedCacheเป็นเจ้าของค่าที่ส่งเข้าPutเว้นแต่ค่านั้นจะถูกคืนผ่านExtractTHPDFDiskPageCache.Lookupคืน bitmap ที่จัดสรรใหม่ โดยผู้เรียกเป็นเจ้าของ- ค่า bitmap ที่ส่งเข้า
THPDFDiskPageCache.Storeยังเป็นของผู้เรียกต่อไป
API ที่เกี่ยวข้อง
- แคช Font Subset แบบคงอยู่
- THotPDF.LoadedFontDecoderCacheMaxBytes
- THotPDF.GetLoadedFontDecoderCacheInfo
- แคช Decode รูปที่โหลดแบบแบ่งชาร์ด
- THotPDF.GetImageDecodeConcurrencyInfo
- THotPDF.RenderCacheFolder
- THotPDF.RenderCacheMaxDocuments
- THotPDF.RenderCacheMaxBytes
- THotPDF.RenderLoadedPageToBitmapCached
- การวินิจฉัยการเรนเดอร์และ telemetry ของ operation