بهینه‌سازی مصرف حافظه در برنامه‌های مشاهده اسناد در مقیاس بزرگ
← Back to Blog8 min read

بهینه‌سازی مصرف حافظه در برنامه‌های مشاهده اسناد در مقیاس بزرگ

بهینه‌سازی مصرف حافظه در نمایشگرهای اسناد .NET در مقیاس بزرگ با Doconut
بهینه‌سازی مصرف حافظه در نمایشگرهای اسناد .NET در مقیاس بزرگ با Doconut

آیا هزاران PDF، فایل Office یا نقشه CAD برای نمایش در یک پورتال مبتنی بر .NET دارید؟ و نمی‌خواهید سرور شما به RAM ختم شود؟ نکته این است که جریان‌سازی تنبل، افزونه‌های هدفمند و خط لوله رندر بهینه‌شده Doconut را ترکیب کنید. در بخش‌های بعدی به مشکلات مرتبط با حافظه که در برنامه‌های مقیاس‌پذیر سازمانی و پر از سند بروز می‌کند می‌پردازیم، سپس نشان می‌دهیم چگونه Doconut—نمایشگر جامع اسناد برای بک‌اندهای .NET—موانعی که نمایشگرهای سنتی را از مقیاس‌پذیری باز می‌دارد، برطرف می‌کند. همچنین یک دوره آزمایشی رایگان در انتظار است اگر می‌خواهید مزایا را در تنظیمات خود ببینید.


درک فشار حافظه در نمایشگرهای اسناد .NET

پورتال‌های بزرگ اسناد اغلب کل فایل را قبل از ظاهر شدن صفحه اول به حافظه می‌کشند. یک نقشه CAD ۲۰۰ مگابایتی یا یک PDF ۵۰۰ صفحه‌ای می‌تواند به سرعت جمع‌کننده زباله .NET را غرق کند، توقف‌های کامل GC را فعال کند و شما را مجبور به تخصیص بیش از حد سرورهایتان کند.

چرا مدل رندر پیش‌فرض .NET مقیاس‌پذیری را آسیب می‌زند

علامتدلیل معمول در پیاده‌سازی‌های ساده
استثنای کمبود حافظهآرایه‌های بایت کل فایل که در یک کش ثابت نگه داشته می‌شوند
بارگذاری کند صفحه اولرمزگشایی کل سند قبل از رندر
کمبود منابع استخر رشته‌هارندرهای طولانی‌مدت وابسته به CPU که خطوط لولهٔ ناهمگام را مسدود می‌کنند
افزایش‌های ناگهانی تاخیر غیرقابل پیش‌بینیجمع‌آوری زباله GC از اشیای بزرگ ثابت (pinned)

اگر افزونه‌های حاشیه‌نویسی یا OCR را اضافه کنید که بیت‌مپ‌های تصویر را انبار می‌کنند، فشار چند برابر می‌شود. نقطهٔ مناسب این است که فقط آنچه کاربر هم‌اکنون نیاز دارد را پردازش کنید و هر بافر میانی را کوتاه‌مدت نگه دارید.

پاسخ Doconut: هسته‌ای سبک و بهینه‌شده از نظر وابستگی‌ها

معماری مبتنی بر .NET 6 Doconut بازنویسی شد تا تخصیص‌های حافظه heap را کاهش دهد:

  • بهینه‌سازی وابستگی – کتابخانه فقط ماژول‌های رندر مورد نیاز برای نوع فایل جاری (PDF، Office، CAD، تصویر) را بارگذاری می‌کند. افزونه‌های استفاده‌نشده در حافظه باقی نمی‌مانند و ردپای پردازش را کوچک نگه می‌دارند.
  • طراحی مبتنی بر جریان – فایل‌ها به‌صورت جریان باز می‌شوند، نه به‌صورت آرایهٔ بایت کامل، بنابراین زمان اجرا می‌تواند داده‌ها را از دیسک به‌صورت درخواست‌شده صفحه‌بندی کند.
  • پشتیبانی از کارهای پس‌زمینه – وظایف تبدیل سنگین می‌توانند به فرآیندهای کارگر یا Azure Functions منتقل شوند و لایهٔ وب برای مشاهده تعاملی آزاد می‌ماند.

وقتی نمایشگر را با الگوهای ناهمگام .NET هماهنگ می‌کنید، Doconut به شما امکان می‌دهد هزاران جلسهٔ همزمان را بر روی یک خوشهٔ VM متوسط سرو کنید.


چگونه بارگذاری تنبل را فعال کنیم

  1. ثبت میدلور Doconut در خط لولهٔ ASP.NET Core خود. این میدلور درخواست‌های نمایشگر را رهگیری می‌کند و سرویس‌های لازم را تزریق می‌نماید.
  2. باز کردن اسناد به‌صورت جریان به‌جای بارگذاری کل فایل. متد OpenDocument Doconut یک مسیر فایل یا یک جریان را می‌پذیرد و توکنی که نمایانگر سند باز شده است برمی‌گرداند.
  3. درخواست صفحات به‌صورت درخواستی از سمت کلاینت. وقتی فرانت‌اند صفحهٔ خاصی را می‌خواهد، Doconut فقط اشیای مورد نیاز را می‌خواند، تصویر رستر را رندر می‌کند و یک تصویر بندانگشتی سبک برمی‌گرداند.

از آنجا که نمایشگر با جریان‌ها کار می‌کند، می‌توانید فایل‌ها را در Azure Blob Storage، Amazon S3 یا یک NAS داخلی نگه دارید بدون اینکه آن‌ها را به دیسک محلی سرور وب کپی کنید. سیستم‌عامل عملیات صفحه‌بندی را انجام می‌دهد و زمان اجرا .NET فقط بافرهای کوچک مورد نیاز برای صفحهٔ فعال را در حافظه نگه می‌دارد.

مزایا برای استقرارهای مقیاس‌پذیر بزرگ

مزیتچگونه Doconut این را محقق می‌کند
استفاده پیش‌بینی‌پذیر RAMکش صفحه با اندازه ثابت + دسترسی فقط به جریان
رندر سریع صفحه اولفقط هدر سند و اشیای صفحهٔ اول را می‌خواند
قابل مقیاس در مرورگرهامنطق مبتنی بر جریان مشابه برای فرانت‌اندهای HTML5/React، Angular یا Vue کار می‌کند
کاهش فشار GCبدون آرایه‌های بایت بزرگ ثابت؛ تمام بافرها کوتاه‌مدت هستند

بارگذاری تنبل را با کارهای تبدیل پس‌زمینه ترکیب کنید، و لایهٔ وب هرگز در تبدیل‌های سنگین CPU متوقف نمی‌شود.


افزونه‌های حاشیه‌نویسی و OCR .NET بدون بار اضافی

سازمان‌ها حاشیه‌نویسی و OCR قابل جستجو را دوست دارند، اما رویکرد ساده تمام بیت‌مپ‌های با وضوح کامل هر صفحه را در حافظه نگه می‌دارد فقط برای رسم هایلایت‌ها یا اجرای تشخیص متن. مدل افزونه Doconut این ویژگی‌ها را به سرویس‌های مستقل و در‑خواست جدا می‌کند.

حاشیه‌نویسی – مدیریت سبک، صفحه به صفحه

هنگامی که صفحه‌ای بارگذاری می‌شود، می‌توانید یک مدیر حاشیه‌نویسی دریافت کنید که فقط داده‌های برداری (مختصات، سبک، یادداشت‌ها) را نگه می‌دارد. افزودن مهر یا هایلایت این فروشگاه برداری را به‌روزرسانی می‌کند؛ بیت‌مپ زیرین هرگز تکرار نمی‌شود. Doconut صفحه را فقط زمانی که کلاینت درخواست می‌کند، با لایهٔ پوششی دوباره رندر می‌کند، بنابراین حتی یک PDF ۵۰۰ صفحه‌ای با هزاران حاشیه‌نویسی فقط بخشی کوچک از حافظه‌ای که یک راه‌حل مبتنی بر بیت‌مپ نیاز دارد، مصرف می‌کند.

OCR – استخراج متن به‌صورت در‑حال‑پرواز

افزونه جستجو OCR را فقط بر روی صفحاتی که کاربر به آن‌ها اسکرول می‌کند اجرا می‌کند. شما وضوح تصویر دلخواه (مثلاً ۲۰۰ dpi) را در گزینه‌های سند تنظیم می‌کنید و Doconut متن را برای صفحهٔ جاری استخراج می‌کند و نتیجه را در یک فهرست فشرده مرتبط با توکن سند ذخیره می‌کند. فرآیند OCR از رندر جدا شده است، که به شما امکان می‌دهد آن را به‌صورت افقی مقیاس‌پذیر کنید (مثلاً از طریق Azure Functions) بدون اینکه ردپای حافظهٔ سرور وب که نمایشگر را سرویس می‌دهد، بزرگ شود.

چرا این برای سازمان‌های بزرگ مهم است

  • هزینه پیش‌بینی‌پذیر – حاشیه‌نویسی و OCR به‌صورت صفحه به صفحه اجرا می‌شوند، نه به‌صورت سندی، که مصرف حافظه را به‌صورت خطی نسبت به محتوای قابل مشاهده نگه می‌دارند.
  • آمادگی برای انطباق – حاشیه‌نویسی‌ها به‌صورت XML ذخیره می‌شوند، که ممیزی یا حذف اطلاعات را ساده می‌کند.
  • ایمنی چند‑مستاجری – توکن هر مستاجر فهرست OCR خود را جدا می‌کند و از نشت داده‌های بین مستاجران جلوگیری می‌کند.

تبدیل سمت سرور و چاپ کنترل‌شده: حفظ کارایی بارهای کاری

بسیاری از پورتال‌ها نیاز دارند فایل‌های Office، نقشه‌های CAD یا پیام‌های ایمیل را به فرمت PDF یا تصویر برای رندر یکنواخت تبدیل کنند. یک دام رایج این است که تبدیل را درون‌فرآیند انجام دهید، که باعث افزایش RAM و CPU در حالی که کاربر منتظر است، می‌شود. افزونه مبدل Doconut بار سنگین را به یک سرویس سمت سرور می‌برد که می‌توانید به‌صورت افقی مقیاس‌پذیر کنید.

تبدیل بدون بارگذاری کل فایل منبع

API تبدیل مسیرهای منبع و هدف (یا جریان‌ها) را می‌پذیرد و به‌صورت جریان‌محور کار می‌کند، بنابراین فایل منبع هرگز به‌صورت کامل در حافظه مادی نمی‌شود. پس از آماده شدن PDF (یا فرمت هدف دیگر)، نمایشگر آن را با استفاده از همان تکنیک بارگذاری تنبل که قبلاً توضیح داده شد، باز می‌کند.

چاپ کنترل‌شده – جلوگیری از رستر‌سازی کل سند

هنگام چاپ PDFهای بزرگ، Doconut کارهای چاپ را صفحه به صفحه به درایور چاپگر می‌فرستد. این روش به شما امکان می‌دهد سهمیه‌ها یا واترمارک‌ها را اعمال کنید بدون اینکه هرگز کل سند را در RAM بارگذاری کنید.

مقیاس‌پذیری سطح سازمانی

سناریوتکنیک صرفه‌جویی در حافظه Doconut
تبدیل دسته‌ای ۱۰٬۰۰۰ فایل Officeاز کارگران پس‌زمینه با تبدیل مبتنی بر جریان استفاده کنید؛ هر کارگر یک فایل را در هر زمان پردازش می‌کند و RAM را کم نگه می‌دارد.
چاپ بر‑تقاضا برای نقشه‌های CAD ۵ رقمیچاپ از طریق جریان صفحه؛ رستر کامل نقشه لازم نیست.
پورتال 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#نمایشگر سند#عملکرد#سازمان