パフォーマンスチューニング

レンダリングとメモリの最適化

Doconut のリソースプロファイルは、render DPI、what stays cached、そしてhow long sessions liveの3つの要素が支配しています。このガイドでは、インパクトの順にレバーを説明します。

解像度 — 最大のレバー

ImageResolution (25–300 DPI) は、レンダー時間と画像サイズの両方を左右します。ほとんどのフォーマットはデフォルトで200 DPI、画像とPSDはデフォルトで100です。

csharp
// ドキュメントリストのプレビューは印刷品質を必要としません
var token = await viewer.OpenDocumentAsync(path, new PdfConfig { ImageResolution = 100 });

DPI を半分にすると、ページあたりのピクセル数は約4分の1になり、レンダーが速くなり、転送が小さくなり、キャッシュメモリも減ります。ズームが多用されるケース(CAD、エンジニアリング図面)では 250–300 DPI を確保してください。

埋め込み画像が多い PDF では、PdfConfig が細かい調整を可能にします:CompressImages + CompressQuality、ResizeImages + ResizeResolution、そして CompressFast。単純な画像の場合、ImageConfig.MaxImagePixelSize(デフォルト 3000 px)が出力サイズの上限となります。

ページキャッシュ — メモリ vs. 再レンダー

BaseConfig.CachePages(デフォルト true)は、セッションの存続期間中、すべてのレンダーページをメモリに保持します。インタラクティブな閲覧には適切なデフォルトで、ユーザーは前後にスクロールできます。以下の場合はオフにしてください:

  • ドキュメントが非常に大きく、一度だけ前から後ろへ閲覧する場合、
  • 多数の同時セッションがキャッシュページを増幅させる場合、
  • RAM を保持するよりも、ビューごとに CPU コストを支払う方が好ましい場合。
csharp
var token = await viewer.OpenDocumentAsync(path, new PdfConfig { CachePages = false });

クライアント側では、ViewerConfig.CacheEnabled = true がブラウザメモリに次のページ画像の小さな移動ウィンドウを事前読み込みします。これはビューごとのプリフェッチキャッシュであり、永続的な localStorage ではありません。

セッション — 見えないメモリ

開かれたすべてのセッションは、解析されたドキュメントモデルと(CachePages を使用して)レンダーページを保持し、スライディング TimeOut(デフォルト 60 分)が 最後のリクエストから 経過するまで保持されます。この状態を管理するための2つの習慣があります:

  • 作業が終わったら閉じる。 viewer.CloseDocument(token) はアイドルウィンドウを待たずにエンジンを即座に解放します。
  • タイムアウトを適切に設定する。 ユーザーが2分程度閲覧するプレビューには1時間のセッションは不要です:
csharp
var token = await viewer.OpenDocumentAsync(path, new DocOptions { TimeOut = 10 });

トレードオフを覚えておいてください:期限切れになるとウィジェットは Document session not found. Please re-open document. を表示します — 実際の読書セッションに合ったタイムアウトを選択してください。

フォーマット別スイッチ

  • Excel: MemoryOptimizationPreference は デフォルトでオン であり、非常に大きなブックのレンダリング時のメモリフットプリントを削減します — オンのままにするか、メモリを犠牲にしてわずかな速度向上を得たい場合は false に設定してください;SheetNames / PrintArea は重要な部分だけのレンダリングを制限します。
  • リダイレクトモードには前もってコストがかかります: DefaultRender = false は開く時に 全体 のドキュメントを PDF に変換します。これによりネイティブなテキスト検索が可能になりますが、500ページのドキュメントでは開く呼び出し時に変換が発生します — 反射的に有効にしないでください。
  • フォントがインストールされていないサーバー上の Word/PowerPoint: Office が入っていない Windows Server は開発マシンに比べてフォントが極端に少ないです。フォントが欠如するとフォールバック探索が遅くなり、メトリクスが誤ります;フォントをインストールするか、FontFolders をフォントが格納されたフォルダーに指すようにしてください。

クライアント側戦略

  • LargeDoc = true — 非常に大きなドキュメント向けの遅延ロード戦略;ユーザーが近づくにつれてページが読み込まれます。
  • AutoLoad = false(デフォルト) — 実際に View(token) を呼び出すまでレンダーしません。
  • ShowThumbs = false — 単一ページまたは埋め込みプレビューの場合、サムネイル生成/リクエストをスキップします。
  • FixedZoom を有効にすると、自由形式のズーム変更を防げます;C# の ViewerConfig をマッピングする際は、小画面向けに FixedZoomPercentMobile(C# デフォルト 75)を調整してください。

起動は一度だけ、リクエストごとではなく

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance) は Application_Start に配置し、DoconutHost.Initialize の隣に置きます — リクエストごとにエンコーディングを登録するのは無駄な作業です;完全に忘れるとレガシーのコードページドキュメントが壊れます。

起動後の最初のドキュメント

Doconut は、アプリケーションでドキュメントが初めて開かれたときにドキュメントエンジンをロードします — プールが開始された後、各リサイクル後、そして新しいアプリケーションドメインごとに。最初のオープンはその後のオープンより遅く、リアルタイムアンチウイルスがさらに遅くすることがあります:エンジンはメモリからロードされ、Microsoft Defender がロード時にコードをスキャンします。フォルダー除外は効果がありません、ファイルが関与しないためです。

4コアの Windows Server 2022 マシンで測定した、2ページの Word ドキュメントを開く場合:

最初のドキュメントそれ以降のすべてのドキュメント
Defender リアルタイム保護オン約 70 秒0.3–7.5 秒、フォーマットに依存
Defender リアルタイム保護オフ12–15 秒0.3–7.5 秒、フォーマットに依存

ユーザーが遭遇する前に、一度だけ支払っておきましょう:

  • ワーカープロセスを常に稼働させる:アプリケーションプールの Start Mode を AlwaysRunning に設定し、idle time-out を延長または無効化して、夜間のアイドルでエンジンがアンロードされないようにします。
  • 起動時にウォームアップする:IIS の Application Initialization を有効にし(サイト上の preloadEnabled="true")、その initializationPage を小さなドキュメントを開くページに指します。最初の実ユーザーはエンジンがすでにロードされていることがわかります。
  • 最初のリクエストに時間を与える:ロードバランサのヘルスチェックや短いタイムアウトの上流プロキシは、成功するはずのコールドスタートを諦めさせることができます。

サーバーのアンチウイルス設定を変更するかどうかは、セキュリティチームの判断です;上記のウォームアップはそれなしでも機能します。

アプリケーションプール

単一サーバー上では、ドキュメントセッションとキャッシュページはワーカープロセスに存在します。アプリケーションプールのリサイクル(スケジュールされたもの、Web.config の編集、またはプールの idle time-out(IIS のデフォルトは 20 分))が行われると、すべてが破棄され、オープンビューアは Document session not found. Please re-open document. を表示します。

  • プールの idle time-out とリサイクルスケジュールを、ユーザーが実際に読む時間に合わせるか、リサイクル後にドキュメントを再度開く準備をしてください。
  • プールを 64 ビットプロセスとして実行する(Enable 32-Bit Applications はオフのまま)。大きなドキュメントは 32 ビットワーカープロセスが持たないアドレス空間を必要とします。
  • Web ファームはセッションを共有ストアに保持するため、1 ノードのリサイクルで失われません — 詳しくは セッションとセキュリティ 。

チューニングチェックリスト

  1. ユーザーエクスペリエンスが受け入れる最小の ImageResolution を設定します。
  2. インタラクティブな閲覧のために CachePages をオンに保ち、ワンパスまたは高同時性シナリオではオフにします。
  3. セッションを明示的に閉じ、使用がバースト的な場合は TimeOut を短くします。
  4. 大きなドキュメント向けにクライアントで LargeDoc とデフォルトの AutoLoad = false を使用します。
  5. テキストを含む PDF 投影が必要な場合にのみ DefaultRender = false を使用します。

このページは役に立ちましたか?