Cross-Reference Map Paging

문서의 cross-reference map이 THotPDF.XRefMapPagingThreshold 항목(기본값 250000, dense 기준 약 8 MB)을 넘어서면 load-complete 패스가 이를 THPDFXRefMapPager로 pack하고 dense array를 놓아줍니다. 덕분에 큰 문서가 정렬된 레코드 map에 모든 항목을 계속 들고 있지 않습니다

THPDFXRefMapPager

pager는 pack된 24바이트 slot(THPDFXRefMapSlot)의 정렬된 snapshot을 저장합니다. slot에는 객체 번호, entry 타입, 16비트 generation, offset, object-stream 위치가 들어갑니다. GetEntry는 LRU로 materialize된 64개 entry page를 두고 binary search로 답하므로, 순차 lookup은 여러 entry를 위해 page 하나만 디코딩합니다. CollectFreeEntries는 증분 업데이트 재구성을 위해 free 집합을 객체 번호 순서로 추출합니다

진단과 소비자

GetLoadedXRefMapPaged는 entry 수, snapshot 바이트, window hit/miss 수와 함께 paging 상태를 보고합니다. 증분 저장의 free-set 재구성과 느리게 materialize되는 stream 멤버의 indirect /Length resolve는 pager를 거쳐 답하고, threshold를 0으로 두면 paging이 완전히 꺼집니다