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

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

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

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


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

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

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

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

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

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

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

  • Dependency Optimization – ライブラリは現在のファイルタイプ(PDF、Office、CAD、画像)に必要なレンダリングモジュールだけをロードします。未使用のプラグインはメモリにロードされず、プロセスフットプリントを極小に保ちます。
  • Stream‑first design – ファイルはバイト配列ではなくストリームとして開かれるため、ランタイムはディスクからオンデマンドでページングできます。
  • Background job support – 重い変換タスクはワーカープロセスや Azure Functions にオフロードでき、Web 層はインタラクティブな閲覧に専念できます。

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


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

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

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

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

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

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


.NET 注釈および OCR プラグイン:余計な負荷を排除

エンタープライズでは 注釈検索可能な OCR が重宝されますが、ナイーブな実装はページごとのフル解像度ビットマップをメモリに保持し続けます。Doconut のプラグインモデルはこれらの機能をオンデマンドサービスとして分離します。

注釈 – 軽量でページ単位の管理

ページが読み込まれると、ベクトルデータ(座標、スタイル、メモ)だけを保持する注釈マネージャが取得できます。スタンプやハイライトを追加してもベクトルストアが更新され、基になるビットマップは二重化されません。クライアントがオーバーレイを要求したときにだけページを再描画するため、500 ページの PDF に何千もの注釈が付いていても、ビットマップ中心のソリューションに比べてごくわずかなメモリしか使用しません。

OCR – 必要なときだけテキスト抽出

Search Plugin はユーザーがスクロールしたページ だけ に OCR を実行します。ドキュメントオプションで画像解像度(例:200 dpi)を設定すれば、現在のページのテキストを抽出し、ドキュメントトークンに紐付いた 圧縮インデックス に保存します。OCR 処理はレンダリングから切り離されているため、Azure Functions などで水平スケーリングしても、ビューアを提供する Web サーバーのメモリフットプリントは増えません。

大企業にとっての重要性

  • 予測可能なコスト – 注釈と 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

バイナリが小さくなるほどワーキングセットも小さくなり、コンテナあたりの RAM 使用量が削減されます。


結論

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

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

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