パフォーマンスチューニング
レンダリングとメモリの最適化
Doconut のリソースプロファイルは、render DPI、what stays cached、how long sessions live の 3 つに支配されています。このガイドでは、インパクトの順にレバーを説明します。
解像度 — 最大のレバー
ImageResolution (25–300 DPI) はレンダー時間と画像サイズの両方を左右します。ほとんどのフォーマットはデフォルトで200 DPIです;画像とPSDはデフォルトで100です。
// ドキュメントリストのプレビューは印刷品質を必要としません
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 ピクセル)が出力サイズを上限します。
ページキャッシュ — メモリ vs. 再レンダー
BaseConfig.CachePages(デフォルトは true)は、セッションの存続期間中、レンダーされたすべてのページをメモリに保持します。インタラクティブな閲覧には適切なデフォルトで、ユーザーは前後にスクロールできます。以下の場合はオフにしてください:
- ドキュメントが非常に大きく、最初から最後まで一度だけ閲覧する場合、
- 多数の同時セッションがキャッシュページを増幅させる場合、
- RAM を保持するよりも、ビューごとに CPU コストを支払う方が好ましい場合。
var token = await viewer.OpenDocumentAsync(path, new PdfConfig { CachePages = false });クライアント側では、ViewerConfig.CacheEnabled = true により、ブラウザのメモリに次のページ画像の小さなウィンドウを事前読み込みします。これはビュー単位のプリフェッチキャッシュであり、永続的な localStorage ではありません。
セッション — 見えないメモリ
開かれた各セッションは、解析されたドキュメントモデルと(CachePages が有効な場合)そのレンダーされたページを保持し、スライディング TimeOut(デフォルト 60 分)が 最後のリクエストから 経過するまで維持されます。この状態を管理するための2つの習慣は次のとおりです:
- 完了したら閉じる。
viewer.CloseDocument(token)はアイドルウィンドウを待たずにエンジンを即座に解放します。 - タイムアウトを適切に設定する。 ユーザーが2分程度閲覧するプレビューには1時間のセッションは不要です:
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 ページのドキュメントではオープン呼び出しがその変換を伴います — 反射的に有効にしないでください。 - Linux/Docker 上の Word/PPT:フォントが欠如すると、フォールバックの探索が遅くなり、メトリクスが正しくありません;
FontFoldersをフォントが格納されたディレクトリに設定してください。 - Linux/macOS 上のプレゼンテーション:PPT/PPTX/PPS/POT/ODP ファイルは開くことができますが、現在のプレゼンテーションエンジンでレンダーするにはネイティブ
libgdiplusとランタイムスイッチSystem.Drawing.EnableUnixSupport=trueが必要です。他のフォーマットファミリーは通常のクロスプラットフォームレンダリングパスを使用します。
クライアント側戦略
LargeDoc = true— 非常に大きなドキュメント向けの遅延ロード戦略;ユーザーがページに近づくとロードされます。AutoLoad = false(デフォルト) — 実際にView(token)を呼び出すまでレンダーしません。ShowThumbs = false— 単一ページや埋め込みプレビューの場合、サムネイル生成/リクエストをスキップします。FixedZoomを有効にすると、自由形式のズーム変更を回避できます;C# のViewerConfigをマッピングする際は、小画面向けにFixedZoomPercentMobile(C# デフォルト 75)を調整してください。
起動は一度だけ、リクエストごとではなく
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance) は Program.cs に配置すべきです — リクエストごとにエンコーディングを登録すると無駄な作業になります;忘れるとレガシーなコードページドキュメントが壊れます。
ノード間で作業を分散
上記はすべて、オンデマンドで単一ノードのレンダーを調整するものです。単一ノードが負荷を吸収できない場合、次のレバーは大きなダイヤルではなく、ドキュメントのアーティファクトを一度共有ストレージに公開し、すべてのノードがそれを提供することです。これによりコストモデルが変わります:レンダーはセッションごとではなくドキュメントごとに一度だけ行われ、ページリクエストはファイル読み取りになります。参照: 分散デプロイ。
チューニングチェックリスト
- UX が受け入れられる最小の
ImageResolutionを設定します。 - インタラクティブな閲覧では
CachePagesをオンに保ち、ワンパスまたは高同時性シナリオではオフにします。 - セッションを明示的に閉じ、使用がバースト的な場合は
TimeOutを短くします。 - 大きなドキュメントではクライアント側で
LargeDocとデフォルトのAutoLoad = falseを使用します。 - テキストを含む PDF 投影が必要な場合にのみ
DefaultRender = falseを使用します。
このページは役に立ちましたか?