אופטימיזציה של שימוש בזיכרון ביישומי צפייה במסמכים בקנה מידה גדול
← Back to Blog7 min read

אופטימיזציה של שימוש בזיכרון ביישומי צפייה במסמכים בקנה מידה גדול

אופטימיזציה של שימוש בזיכרון במציגי מסמכים .NET בקנה מידה גדול עם Doconut
אופטימיזציה של שימוש בזיכרון במציגי מסמכים .NET בקנה מידה גדול עם Doconut

יש לך אלפי קבצי PDF, קבצי Office או שרטוטי CAD להצגה ב‑פורטל מבוסס .NET? ואתה לא רוצה שהשרת שלך ייגמר מזיכרון? הטכניקה היא לשלב זרימה עצלה, תוספים ממוקדים, וצינור רינדור אופטימלי של Doconut. בפרקים הבאים נעבור על הכאבים הקשורים לזיכרון שמופיעים באפליקציות בקנה מידה ארגוני עם עומס מסמכים גבוה, ואז נציג כיצד Doconut—מציג המסמכים האוניברסלי עבור backend‑ים של .NET—חוצה את צווארי הבקבוק שמונעים מציגים מסורתיים להתרחב. אה, ויש גרסת ניסיון חינם שממתינה אם ברצונך לראות את השיפור במערכת שלך.


הבנת הלחץ על הזיכרון במציגי מסמכים ב‑.NET

פורטלים של מסמכים גדולים לעיתים קרובות שותקים קובץ שלם לזיכרון לפני שהעמוד הראשון מופיע. קובץ CAD של 200 MB או PDF של 500 עמודים יכולים להציף במהירות את מנגנון האיסוף של .NET, לגרום לעצירות GC מלאות ולחייב אותך להקצות משאבים מיותרים לשרתים.

מדוע מודל הרינדור ברירת המחדל של .NET פוגע בקנה מידה

סימפטוםסיבה טיפוסית במימושים נאיביים
חריגות חוסר זיכרוןמערכי בתים של קובץ שלם נשמרים במטמון סטטי
טעינה איטית של העמוד הראשוןפענוח כל המסמך לפני הרינדור
מחסור במשאבי בריכת תהליכיםרינדור ארוך זמן תופס CPU וחוסם צינורות אסינכרוניים
קפיצות לא צפויות בעיכובאיסוף על ידי מנגנון האיסוף של אובייקטים גדולים שמוצמדים

הוספת תוספי אנוטציה או OCR שמחזיקים מפת סיביות של תמונות, והלחץ מתרבה. הנקודה האופטימלית היא לעבד רק את מה שהמשתמש צריך כרגע ולשמור שכל חוצץ ביניים יהיה קצר‑חיים.

התשובה של Doconut: ליבה רזה, מותאמת תלותיות

הארכיטקטורה של Doconut מבוססת .NET 6 נבנתה מחדש כדי להפחית הקצאות ערימה:

  • אופטימיזציית תלותיות – הספרייה טוענת רק את מודולי הרינדור הדרושים לסוג הקובץ הנוכחי (PDF, Office, CAD, תמונה). תוספים שאינם בשימוש נשארים מחוץ לזיכרון, מה שמקטין את טביעת התהליך.
  • עיצוב זרימה‑קודם – קבצים נפתחים כזרמים, לא כמערכי בתים שלמים, כך שהזמן ריצה יכול לטעון נתונים מהדיסק לפי דרישה.
  • תמיכה בעבודות רקע – משימות המרה כבדות ניתן להעביר לתהליכי עבודה או ל‑Azure Functions, מה שמאפשר לשכבת האינטרנט להיות חופשית לצפייה אינטראקטיבית.

כאשר אתה מתאם את המציג עם דפוסי האסינכרון של .NET, Doconut מאפשר לך לשרת אלפי מפגשים מקבילים במאגר VM צנוע.

כיצד להפעיל טעינה עצלה

  1. רשום את ה‑middleware של Doconut בצינור ה‑ASP.NET Core שלך. ה‑middleware תופס בקשות מציג ומזריק את השירותים הנדרשים.
  2. פתח מסמכים כזרמים במקום לטעון את הקובץ כולו. השיטה OpenDocument של Doconut מקבלת נתיב קובץ או זרם ומחזירה אסימון שמייצג את המסמך הפתוח.
  3. בקש עמודים לפי דרישה מהצד של הלקוח. כאשר הממשק הקדמי מבקש עמוד ספציפי, Doconut קוראת רק את האובייקטים הדרושים, מרנדרת את תמונת הרסטר ומחזירה תמונה ממוזערת קלה.

מאחר שהמציג עובד עם זרמים, ניתן לשמור קבצים ב‑Azure Blob Storage, Amazon S3, או ב‑NAS מקומי מבלי להעתיק אותם לדיסק המקומי של שרת האינטרנט. מערכת ההפעלה עושה את העמודה, וה‑runtime של .NET מחזיק רק את החוצצים הקטנים הדרושים לעמוד הפעיל.

יתרונות לפריסות בקנה מידה גדול

יתרוןאיך Doconut משיג זאת
שימוש בזיכרון RAM צפוימטמון עמודים בגודל קבוע + גישה רק לזרמים
רינדור מהיר של העמוד הראשוןקורא רק את כותרת המסמך ואת אובייקטי העמוד הראשון
ניתן להרחבה בין דפדפניםהוגיון מבוסס זרימה זהה עובד עבור ממשקים קדמיים של HTML5/React, Angular או Vue
לחץ GC מצומצםאין מערכי בתים גדולים שמוצמדים; כל החוצצים קצרים‑חיים

תוספי אנוטציה ו‑OCR ל‑.NET ללא עומס מיותר

ארגונים אוהבים אנוטציה ו‑OCR חיפוש , אך גישה נאיבית משאירה מפת סיביות ברזולוציה מלאה של כל עמוד בזיכרון רק כדי לצייר הדגשות או לבצע זיהוי טקסט. מודל התוספים של Doconut מבודד תכונות אלו לשירותים עצמאיים, לפי דרישה.

אנוטציה – ניהול קל משקל, לפי עמוד

כאשר עמוד נטען, ניתן לקבל מנהל אנוטציה שמחזיק רק את נתוני הווקטור (קואורדינטות, סגנון, הערות). הוספת חותמת או הדגשה מעדכנת את החנות הווקטורית; מפת הסיביות הבסיסית לעולם לא משוכפלת. Doconut מרנדר את העמוד עם השכבה רק כאשר הלקוח מבקש זאת, ולכן אפילו PDF של 500 עמודים עם אלפי אנוטציות צורך רק חלק קטן מהזיכרון שמערכת מבוססת מפת סיביות הייתה דורשת.

OCR – חילוץ טקסט בזמן ריצה

תוסף החיפוש מריץ OCR רק על העמודים שהמשתמש גולל אליהם. ניתן להגדיר את רזולוציית התמונה הרצויה (למשל 200 dpi) באפשרויות המסמך, ו‑Doconut מחלץ טקסט עבור העמוד הנוכחי, ושומר את התוצאה ב‑אינדקס דחוס המקושר לאסימון המסמך. תהליך ה‑OCR מופרד מהרינדור, מה שמאפשר להרחיב אותו אופקית (למשל באמצעות Azure Functions) ללא הגדלת טביעת הזיכרון של שרת האינטרנט שמגיש את המציג.

מדוע זה חשוב לארגונים גדולים

  • עלות צפויה – אנוטציה ו‑OCR פועלים לפי עמוד, לא לפי מסמך, מה ששומר על שימוש בזיכרון ליניארי לתוכן הגלוי.
  • מוכן לציות – אנוטציות נשמרות כ‑XML, מה שמקל על ביקורות או מחיקות.
  • בטיחות מרובה‑שוכרים – האסימון של כל שוכר מבודד את אינדקס ה‑OCR שלו, ומונע דליפת נתונים בין שוכרים.

המרה בצד השרת והדפסה מבוקרת: שמירת יעילות העומסים

רבים מהפורטלים צריכים להמיר קבצי Office, שרטוטי CAD, או הודעות דוא"ל ל‑PDF או פורמטים של תמונה לצורך רינדור אחיד. מלכודת נפוצה היא לבצע את ההמרה בתהליך הראשי, מה שמוביל לפיצוצים בזיכרון וב‑CPU בזמן שהמשתמש ממתין. תוסף הממיר של Doconut מעביר את העומס הכבד ל‑שירות צד‑שרת שניתן להרחיב אופקית.

המרה ללא טעינת קובץ המקור כולו

ממשק ההמרה מקבל נתיבי מקור ויעד (או זרמים) ופועל בצורה של זרימה, כך שהקובץ המקור לעולם לא מתממש במלואו בזיכרון. ברגע שה‑PDF (או פורמט היעד) מוכן, המציג פותח אותו באמצעות אותה טכניקת טעינה עצלה שתוארה קודם.

הדפסה מבוקרת – הימנעות מרסטריזציה של כל המסמך

כאשר מדפיסים PDFs גדולים, Doconut משדר משימות הדפסה עמוד‑אחר‑עמוד ל‑driver המדפסת. גישה זו מאפשרת להפעיל מכסות או סימני מים מבלי לטעון את כל המסמך לזיכרון.

הרחבה ברמת ארגון

תרחישטכניקת חיסכון בזיכרון של Doconut
המרה קבוצתית של 10 000 קבצי Officeהשתמש בעובדי רקע עם המרה מבוססת זרימה; כל עובד מטפל בקובץ אחד בכל פעם, מה שמוריד את השימוש ב‑RAM.
הדפסה לפי דרישה של שרטוטי CAD בעלות 5 ספרותהדפסה באמצעות זרימת עמודים; אין צורך ברסטר של כל השרטוט.
פורטל SaaS מרובה‑שוכריםתורים נפרדים להמרה לכל שוכר; בידוד הזיכרון מתבצע אוטומטית מכיוון שכל משימה פועלת על זרם משלה.

שיטות עבודה מומלצות להרחבת Doconut בסביבות ארגוניות

גם עם מנוע חסכוני בזיכרון, פריסות בעולם האמיתי דורשות כמה קווי מנחה. להלן פרקטיקות מוכחות שמעצימות את החוזק המובנה של Doconut.

1. הגבל את גודל מטמון העמודים לכל סשן

הגדר את המציג כך שישמור רק את העמודים האחרונים בזיכרון. הקטנת גודל המטמון מורידה ישירות את צריכת ה‑RAM לכל סשן.

2. הפעל OCR והמרה במיקרו‑שירותים מבודדים

פרוס את תוסף החיפוש ו‑תוסף הממיר כמכולות נפרדות מאחורי תור הודעות (RabbitMQ, Azure Service Bus, וכו'). כך מבודדים פיצוצים בזיכרון ומאפשרים סקיילינג אוטומטי לכל רכיב בנפרד.

3. אפשר את Trim ו‑ReadyToRun של .NET 6

כאשר אתה מפרסם את ה‑API המונע על‑ידי Doconut, הפעל קיצוץ (trimming) כדי להסיר IL שאינו בשימוש ולצמצם את גודל הקובץ הבינארי:

dotnet publish -c Release -r win-x64 --self-contained true /p:PublishTrimmed=true

בינארי קטן יותר משמעותו קבוצת עבודה קטנה יותר, מה שמתרגם לפחות RAM לכל קונטיינר.


סיכום

אופטימיזציה של שימוש בזיכרון היא חיונית לכל פתרון צפייה במסמכים בקנה מידה גדול. על‑ידי ניצול הארכיטקטורה מבוססת זרימה של Doconut, הליבה המותאמת תלותיות, ותוספי אנוטציה/OCR לפי דרישה, ניתן לשמור על צריכת RAM צפויה תוך מתן חוויית צפייה מהירה ותגובה. יישום תבניות העבודה המומלצות – קאשינג מבוזר, הגבלת מטמון עמודים, בידוד מיקרו‑שירותים, ובנייה מקוצצת – יפתח את הפוטנציאל המלא של Doconut להרחבה.

מוכן לראות את ההבדל בעצמך? התחל את גרסת הניסיון החינמית של Doconut היום וחווה צפייה במסמכים עם זיכרון נמוך וביצועים גבוהים ביישומי .NET שלך.

#document viewer#performance#.NET#enterprise#Doconut#מציג מסמכים#ביצועים#ארגוני