THPDFCoalescingRandomAccessSource Class
עוטף כל THPDFRandomAccessSource עם מטמון טווחים תחום ו-prefetch אסינכרוני מודע-ביטול
הצהרה
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;
מיזוג טווחים
- החמצת מטמון מתרחבת אל בלוק מיושר שמכסה את הבתים המבוקשים, כך שקריאות parser סמוכות חולקות בקשת אחסון-גיבוי אחת
- המטמון אוכף מגבלות בלתי תלויות של סך בתים, פר-entry ומספר כניסות אופציונלי, וטווח ענק עוקף את מדיניות השימור
- קבלה אדפטיבית משלבת סדר least-recently-used עם סקיצת תדירות תחומה מזדקנת, כך שסריקות קרות קוראות ישירות בלי להחליף טווחים שמורים חמים יותר
- כאשר מקור דליל אינו יכול לספק בלוק מורחב, המעטפת חוזרת לטווח המבוקש הזמין המדויק
- הגישה למקור מסודרת, כך שתתי-מחלקות קיימות לא צריכות להפוך לבטוחות-thread
Prefetch אסינכרוני וביטול
PrefetchRange מתזמן טווח רקע אחד ומחליף בקשה מוקדמת שאינה קשורה
החמצת מטמון בחזית, מחוץ לטווח הפעיל, מבטלת את ה-worker לפני רכישת מנעול המקור, ומאפשרת לטרנספורט שיתופי לפנות במהירות לפעולה הנראית
דרסו את THPDFRandomAccessSource.ReadAtCancellable כדי לבחון את ה-THPDFCancellationToken שסופק בזמן I/O של רשת או אחסון; המימוש היורש בודק ביטול מיד לפני ואחרי ReadAt
הגדירו AsyncPrefetchEnabled כ-False כאשר מדיניות הטרנספורט אוסרת גישת רקע
קריאה מקדימה אדפטיבית
stream ה-parser קורא ל-ObserveReadPattern אחרי כל קריאה מוצלחת; קריאות קדימה מתמשכות מגדילות את חלון הקריאה המקדימה דרך 1, 2, 4 ו-8 בלוקים, בעוד seek או גישה אחורה מדכאים טרנספורט ספקולטיבי מיד
SequentialReadToleranceBytes מקבל פערי קדימה קטנים כגישה סדרתית וברירת המחדל שלו היא 4096 בתים; MaxReadAheadBlocks מגביל את החלון האדפטיבי מ-1 ועד 32 בלוקים וברירת המחדל שלו היא 8
החלון האפקטיבי מוגבל גם על ידי MaxCacheBytes, כך שקריאה מקדימה אינה יכולה במכוון לחרוג מקיבולת המטמון שהוגדרה; הביטחון הסדרתי מתאושש בהדרגה אחרי קפיצה אקראית
הגדירו AdaptiveReadAheadEnabled כ-False עבור prefetch קבוע של בלוק אחד, תוך שמירה על טרנספורט אסינכרוני
סטטיסטיקות
TransferAt רוכש הפניות לבלוקי מטמון שמורים וכותב אותם ליעד בלי להקצות או למלא חוצץ קריאה ביניים
THPDFRangeCacheStatistics מדווח ספירת קריאות ובתים של מקור הגיבוי, hits ו-misses של מטמון, קבלות, דחיות ופינויים של מטמון, קבלות, דחיות והזדקנות לפי תדירות, בקשות, השלמות וביטולים של prefetch, קריאות סדרתיות ואקראיות, prefetch מדוכא, בלוקי קריאה מקדימה נוכחיים ובשיא, קריאות ובתים של העברה ישירה, וכן ספירה ובתים נוכחיים של טווחי מטמון
בעלות
כאשר OwnsSource הוא True, הריסת המעטפת מבטלת וממתינה ל-worker שלה, משחררת טווחי מטמון ומשחררת את המקור העטוף