大規模ドキュメント閲覧アプリケーションにおけるメモリ使用量の最適化
← Back to Blog2 min read

大規模ドキュメント閲覧アプリケーションにおけるメモリ使用量の最適化

大規模 .NET ドキュメントビューアにおけるメモリ使用量の最適化(Doconut)
大規模 .NET ドキュメントビューアにおけるメモリ使用量の最適化(Doconut)

何千ものPDF、Officeファイル、またはCAD図面を .NET‑ベースのポータル で表示する必要がありますか?そしてサーバーのRAMが足りなくなるのは避けたいですか?コツは 遅延ストリーミング、ターゲットプラグイン、そして Doconut の最適化されたレンダリングパイプライン を組み合わせることです。次のセクションでは、エンタープライズ規模のドキュメントが多いアプリで発生するメモリ関連の頭痛の種を解説し、.NET バックエンド向けのユニバーサルドキュメントビューアである Doconut が従来のビューアのスケーリングを妨げるボトルネックをどのように突破するかを示します。あとは 無料トライアル が待っているので、実際の環境で効果を確認できます。


.NET ドキュメントビューアにおけるメモリ圧迫の理解

大規模なドキュメントポータルは、最初のページが表示される前にファイル全体をメモリに読み込んでしまうことがよくあります。200 MB の CAD 図面や 500 ページの PDF は、.NET ガベージコレクタをすぐに圧迫し、フル GC の一時停止を引き起こし、サーバーを過剰にプロビジョニングせざるを得なくなります。

デフォルトの .NET レンダリングモデルがスケーラビリティを阻害する理由

症状典型的な原因(素朴な実装の場合)
Out‑of‑memory 例外全ファイルのバイト配列が静的キャッシュに保持される
ページの最初の読み込みが遅いレンダリング前にドキュメント全体をデコードする
スレッドプールの枯渇CPU バウンドの長時間レンダリングが非同期パイプラインをブロックする
予測不能なレイテンシスパイク大きなピン留めオブジェクトの GC 回収

アノテーションOCR プラグインを追加して画像ビットマップを大量に保持すると、圧迫はさらに増大します。最適なポイントは ユーザーが現在必要とするものだけを処理 し、すべての中間バッファを短命に保つことです。

Doconut の回答:軽量で依存関係最適化されたコア

Doconut の .NET 6 ベースのアーキテクチャは、ヒープ割り当てを削減するように再構築されました:

  • 依存関係の最適化 – ライブラリは現在のファイルタイプ(PDF、Office、CAD、画像)に必要なレンダリングモジュールだけをロードします。未使用のプラグインはメモリにロードされず、プロセスのフットプリントを極小に保ちます。
  • ストリーム優先設計 – ファイルは全バイト配列ではなくストリームとして開かれるため、ランタイムは必要に応じてディスクからデータをページングできます。
  • バックグラウンドジョブのサポート – 重い変換タスクはワーカープロセスや Azure Functions にオフロードでき、Web 層はインタラクティブな閲覧に専念できます。

.NET の非同期パターンとビューアを組み合わせると、Doconut は控えめな VM クラスタ上で数千の同時セッションを提供できます。

遅延ロードを有効にする方法

  1. ASP.NET Core パイプラインに Doconut のミドルウェアを登録します。このミドルウェアはビューアのリクエストをインターセプトし、必要なサービスを注入します。
  2. ドキュメントを全体としてロードするのではなく、ストリームとして開きます。Doconut の OpenDocument メソッドはファイルパスまたはストリームを受け取り、開かれたドキュメントを表すトークンを返します。
  3. クライアント側からページをオンデマンドで要求します。フロントエンドが特定のページを要求すると、Doconut は必要なオブジェクトだけを読み取り、ラスタ画像をレンダリングし、軽量なサムネイルを返します。

ビューアが ストリーム で動作するため、ファイルを Azure Blob Storage、Amazon S3、またはオンプレミスの NAS に保持したまま、Web サーバーのローカルディスクにコピーする必要はありません。OS がページングを行い、.NET ランタイムはアクティブなページに必要な小さなバッファだけを保持します。

大規模展開におけるメリット

メリットDoconut の実現方法
予測可能な RAM 使用量固定サイズのページキャッシュ + ストリームのみのアクセス
最初のページの高速レンダリングドキュメントヘッダーと最初のページオブジェクトのみを読み取る
ブラウザ横断的なスケーラビリティ同じストリームベースのロジックが HTML5/React、Angular、Vue フロントエンドで機能する
GC の負荷軽減大きなピン留めバイト配列がなく、すべてのバッファが短命である

遅延ロードとバックグラウンド変換ジョブを組み合わせれば、Web 層が CPU 重い変換で停止することはありません。


.NET アノテーションと OCR プラグインの過剰なオーバーヘッドなし

企業は アノテーション検索可能な OCR を好みますが、素朴なアプローチではハイライト描画や文字認識のために各ページのフル解像度ビットマップをメモリに保持します。Doconut のプラグインモデルはこれらの機能を独立したオンデマンドサービスとして分離します。

アノテーション – 軽量でページ単位の管理

ページがロードされると、座標、スタイル、ノートといったベクターデータだけを保持するアノテーションマネージャを取得できます。スタンプやハイライトを追加するとこのベクトルストアが更新され、基になるビットマップは決して複製されません。Doconut はクライアントが要求したときにのみオーバーレイを付加してページを再レンダリングするため、数千件のアノテーションがある 500 ページの PDF でも、ビットマップ中心のソリューションが必要とするメモリのごく一部しか消費しません。

OCR – 即時テキスト抽出

Search Plugin はユーザーがスクロールしたページに対してのみ OCR を実行します。ドキュメントオプションで希望の画像解像度(例:200 dpi)を設定すると、Doconut は現在のページのテキストを抽出し、ドキュメントトークンに紐付いた 圧縮インデックス に結果を保存します。OCR プロセスはレンダリングから切り離されているため、ビューアを提供する Web サーバーのメモリフットプリントを増やすことなく、水平スケーリング(例:Azure Functions)を可能にします。

大企業にとっての重要性

  • 予測可能なコスト – アノテーションと OCR はページ単位で実行され、ドキュメント全体ではなく表示中のコンテンツに比例したメモリ使用量となります。
  • コンプライアンス対応 – アノテーションは XML で保存されるため、監査やマスク処理が容易です。
  • マルチテナントの安全性 – 各テナントのトークンが OCR インデックスを分離し、テナント間のデータ漏洩を防止します。

サーバーサイド変換と制御された印刷:ワークロードの効率化

多くのポータルでは、Office ファイル、CAD 図面、またはメールメッセージを PDF や画像形式に 変換 して統一的にレンダリングする必要があります。一般的な落とし穴は、変換をプロセス内で行うことで、ユーザーが待機中に RAM と CPU が急増してしまうことです。Doconut の Converter Plugin は重い処理を サーバーサイドサービス に委譲し、水平スケーリングが可能です。

ソースファイル全体をロードせずに変換

変換 API はソースとターゲットのパス(またはストリーム)を受け取り、ストリーミング方式で動作するため、ソースファイルがメモリに完全に展開されることはありません。PDF(または他のターゲット形式)が生成されたら、ビューアは前述の遅延ロード手法でそれを開きます。

制御された印刷 – ドキュメント全体のラスタライズ回避

大きな PDF を印刷する際、Doconut は 印刷ジョブをページ単位でストリーム し、プリンタドライバに送ります。この手法により、ドキュメント全体を RAM にロードすることなく、クォータや透かしを適用できます。

エンタープライズ向けスケーリング

シナリオDoconut のメモリ削減技術
10,000 件の Office ファイルのバッチ変換ストリームベースの変換を使用したバックグラウンドワーカーを利用し、各ワーカーが同時に 1 ファイルを処理することで RAM 使用量を低く保つ
5 桁の CAD 図面のオンデマンド印刷ページストリームで印刷し、全図面のラスタライズは不要
マルチテナント SaaS ポータルテナントごとに変換キューを分離し、各ジョブが独自のストリームで動作するためメモリ分離が自動的に行われる

エンタープライズ環境で Doconut をスケールさせるベストプラクティス

メモリ効率の高いエンジンを使用していても、実運用ではいくつかのガードレールが必要です。以下は、Doconut の組み込み機能をさらに強化する実証済みのベストプラクティスです。

1. セッションごとのページキャッシュサイズを制限する

ビューアの設定で、メモリに保持するページを最新のものだけに制限します。キャッシュサイズを縮小することで、セッションごとの RAM 消費が直接削減されます。

2. OCR と変換を分離されたマイクロサービスで実行する

Search PluginConverter Plugin をメッセージキュー(RabbitMQ、Azure Service Bus など)の背後にある別々のコンテナとしてデプロイします。これによりメモリスパイクが分離され、各コンポーネントを個別に自動スケールできます。

3. .NET 6 の TrimReadyToRun を有効にする

Doconut を搭載した API を公開する際、未使用の IL を削除しバイナリサイズを縮小するためにトリミングを有効にします:

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

結論

メモリ使用量の最適化は、あらゆる大規模ドキュメント閲覧ソリューションにとって不可欠です。Doconut の ストリーム優先アーキテクチャ依存関係最適化コア、そして オンデマンドのアノテーション/OCR プラグイン を活用すれば、RAM 消費を予測可能に保ちつつ、迅速で応答性の高い閲覧体験を提供できます。推奨されるベストプラクティス—分散トークンキャッシュ、ページキャッシュの制限、マイクロサービスの分離、トリムビルド—を導入すれば、Doconut のスケーラビリティポテンシャルを最大限に引き出せます。

違いをご自身で確認したいですか? 今すぐ Doconut の無料トライアルを開始 して、.NET アプリケーションで低メモリ・高パフォーマンスのドキュメント閲覧を体験してください。

#document viewer#performance#.NET#enterprise#Doconut#ドキュメントビューア#パフォーマンス#エンタープライズ