Оптимизация использования памяти в масштабных приложениях для просмотра документов
← Back to Blog7 min read

Оптимизация использования памяти в масштабных приложениях для просмотра документов

Оптимизация использования памяти в масштабных .NET‑просмотрщиках документов с Doconut
Оптимизация использования памяти в масштабных .NET‑просмотрщиках документов с Doconut

Есть тысячи PDF, файлов Office или чертежей CAD, которые нужно показывать в портале на базе .NET? И вы не хотите, чтобы ваш сервер исчерпал ОЗУ? Хитрость — сочетать отложенную потоковую передачу, целевые плагины и оптимизированный конвейер рендеринга Doconut. В следующих разделах мы разберём типичные проблемы с памятью, возникающие в корпоративных приложениях с большим объёмом документов, а затем покажем, как Doconut — универсальный просмотрщик документов для .NET‑бэкендов — преодолевает узкие места традиционных решений. Кстати, доступна бесплатная пробная версия, если хотите увидеть выгоды в своей среде.


Понимание давления на память в .NET‑просмотрщиках документов

Большие порталы часто загружают весь файл в память до того, как появляется первая страница. CAD‑чертёж размером 200 МБ или PDF‑файл в 500 страниц могут быстро перегрузить сборщик мусора .NET, вызвать паузы полной сборки и заставить вас переизбрать серверы.

Почему стандартная модель рендеринга .NET ухудшает масштабируемость

СимптомТипичная причина в наивных реализациях
Исключения Out‑of‑memoryМассивы байтов всего файла хранятся в статическом кэше
Медленная загрузка первой страницыДекодирование всего документа перед рендерингом
Недостаток потоков в пулеДлительные CPU‑зависимые операции рендеринга блокируют асинхронные конвейеры
Непредсказуемые всплески задержкиСборка мусора больших закреплённых объектов

Добавьте плагины аннотаций или OCR, которые копят битмапы изображений, и нагрузка возрастает. Оптимальное решение — обрабатывать только то, что сейчас нужно пользователю, и держать каждый промежуточный буфер короткоживущим.

Ответ Doconut: лёгкое, оптимизированное по зависимостям ядро

Архитектура Doconut на базе .NET 6 была перестроена, чтобы сократить выделения кучи:

  • Оптимизация зависимостей — библиотека загружает только те модули рендеринга, которые требуются для текущего типа файла (PDF, Office, CAD, изображение). Неиспользуемые плагины остаются вне памяти, уменьшая общий след процесса.
  • Дизайн «поток‑в‑первую очередь» — файлы открываются как потоки, а не как целые массивы байтов, поэтому рантайм может подгружать данные с диска по запросу.
  • Поддержка фоновых задач — тяжёлые операции конвертации можно вынести в воркеры или Azure Functions, оставив веб‑слой свободным для интерактивного просмотра.

Когда вы соединяете просмотрщик с асинхронными паттернами .NET, Doconut позволяет обслуживать тысячи одновременных сессий на скромном кластере ВМ.

Как включить отложенную загрузку

  1. Зарегистрировать middleware Doconut в конвейере ASP.NET Core. Middleware перехватывает запросы к просмотрщику и внедряет необходимые сервисы.
  2. Открывать документы как потоки, а не загружать весь файл целиком. Метод Doconut OpenDocument принимает путь к файлу или поток и возвращает токен, представляющий открытый документ.
  3. Запрашивать страницы по требованию с клиентской стороны. Когда фронтенд запрашивает конкретную страницу, Doconut читает только нужные объекты, рендерит растровое изображение и возвращает лёгкую миниатюру.

Поскольку просмотрщик работает с потоками, вы можете хранить файлы в Azure Blob Storage, Amazon S3 или локальном NAS без копирования их на диск веб‑сервера. ОС занимается подкачкой, а .NET‑рантайм держит лишь крошечные буферы, необходимые для активной страницы.

Преимущества для масштабных развертываний

ПреимуществоКак Doconut достигает этого
Предсказуемое использование ОЗУКеш фиксированного размера + доступ только через поток
Быстрый рендер первой страницыЧтение лишь заголовка документа и объектов первой страницы
Масштабируемость в разных браузерахОдин и тот же потоковый подход работает для фронтендов на HTML5/React, Angular или Vue
Сниженное давление на сборщик мусораНет больших закреплённых массивов; все буферы короткоживущие

Сочетайте отложенную загрузку с фоновыми задачами конвертации, и веб‑слой никогда не будет «зависать» из‑за тяжёлых трансформаций.


Плагины .NET для аннотаций и OCR без лишних расходов

Предприятия любят аннотации и поисковый OCR, но наивный подход держит битмап полного разрешения каждой страницы в памяти, лишь бы нарисовать выделения или выполнить распознавание текста. Плагин‑модель Doconut изолирует эти функции в независимые, вызываемые по требованию сервисы.

Аннотации — лёгкое управление по страницам

При загрузке страницы вы получаете менеджер аннотаций, который хранит только векторные данные (координаты, стиль, заметки). Добавление штампа или выделения обновляет этот векторный магазин; исходный битмап никогда не дублируется. Doconut пере‑рендерит страницу с наложением только по запросу клиента, поэтому даже PDF в 500 страниц с тысячами аннотаций потребляет лишь часть памяти, которую требовал бы битмап‑ориентированный подход.

OCR — извлечение текста «на лету»

Search Plugin выполняет OCR только на тех страницах, до которых прокручивается пользователь. Вы задаёте желаемое разрешение изображения (например, 200 dpi) в параметрах документа, и Doconut извлекает текст текущей страницы, сохраняя результат в сжатом индексе, привязанном к токену документа. Процесс OCR отделён от рендеринга, что позволяет масштабировать его горизонтально (например, через Azure Functions) без увеличения памяти веб‑сервера, обслуживающего просмотрщик.

Почему это важно для крупных предприятий

  • Предсказуемая стоимость — аннотации и OCR работают постранично, а не постдокументно, что делает потребление памяти линейным относительно видимого контента.
  • Готовность к соответствию — аннотации хранятся в XML, что упрощает аудит и редактирование.
  • Безопасность в мульти‑тенанте — токен каждого арендатора изолирует его OCR‑индекс, предотвращая утечки данных между арендаторами.

Серверная конвертация и контролируемая печать: экономия ресурсов

Многие порталы должны конвертировать файлы Office, чертежи CAD или электронные письма в PDF или изображения для единообразного рендеринга. Частая ошибка — выполнять конвертацию в том же процессе, что резко повышает ОЗУ и ЦП, пока пользователь ждёт. Плагин Converter Plugin от Doconut переносит тяжёлую работу в серверный сервис, который можно масштабировать горизонтально.

Конвертация без загрузки полного исходного файла

API конвертации принимает пути (или потоки) к источнику и цели и работает потоково, поэтому исходный файл никогда полностью не материализуется в памяти. Как только PDF (или другой целевой формат) готов, просмотрщик открывает его тем же способом отложенной загрузки, описанным выше.

Контролируемая печать — избегаем полной растеризации документа

При печати больших PDF Doconut передаёт печать постранично драйверу принтера. Такой подход позволяет задавать квоты или водяные знаки без необходимости загружать весь документ в ОЗУ.

Масштабируемость корпоративного уровня

СценарийТехника экономии памяти Doconut
Пакетная конвертация 10 000 файлов OfficeИспользовать фоновые воркеры с потоковой конвертацией; каждый воркер обрабатывает один файл за раз, удерживая ОЗУ на низком уровне.
Печать по запросу 5‑значных чертежей CADПечать постраничным потоком; полная растеризация чертежа не требуется.
SaaS‑портал с несколькими арендаторамиОтдельные очереди конвертации для каждого арендатора; изоляция памяти автоматична, потому что каждая задача работает со своим потоком.

Лучшие практики масштабирования Doconut в корпоративных средах

Даже при памяти‑эффективном ядре реальное развертывание требует некоторых ограничений. Ниже представлены проверенные практики, усиливающие встроенные возможности Doconut.

1. Ограничьте размер кеша страниц на сессию

Настройте просмотрщик так, чтобы в памяти хранились только самые последние страницы. Уменьшение размера кеша напрямую снижает потребление ОЗУ на одну сессию.

2. Запускайте OCR и конвертацию в изолированных микросервисах

Разверните Search Plugin и Converter Plugin в отдельных контейнерах за очередью сообщений (RabbitMQ, Azure Service Bus и т.п.). Это изолирует всплески памяти и позволяет автоматически масштабировать каждый компонент независимо.

3. Включите Trim и ReadyToRun в .NET 6

При публикации API на базе Doconut включите обрезку, чтобы избавиться от неиспользуемого IL и уменьшить размер бинарника:

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

Меньший бинарник — меньший рабочий набор, что переводит в меньшее потребление ОЗУ на контейнер.


Заключение

Оптимизация использования памяти — ключевой фактор любой масштабной системы просмотра документов. Используя поток‑в‑первую архитектуру Doconut, оптимизированное ядро зависимостей и плагины аннотаций/OCR по требованию, вы получаете предсказуемое потребление ОЗУ и быструю, отзывчивую работу. Применяйте рекомендованные практики — распределённый кеш токенов, ограниченный кеш страниц, микросервисная изоляция, обрезанные сборки — и раскрывайте весь потенциал масштабируемости Doconut.

Начните бесплатную пробную версию Doconut сегодня и испытайте низкопамятный, высокопроизводительный просмотр документов в своих .NET‑приложениях.

#document viewer#performance#.NET#enterprise#Doconut#просмотр документов#производительность#корпоративный