성능 튜닝

렌더링 및 메모리 최적화

Doconut의 리소스 프로파일은 세 가지 요소가 지배합니다: 렌더 DPI, 캐시되는 내용, 그리고 세션 지속 시간. 이 가이드는 영향도 순서대로 레버를 설명합니다.

해상도 — 가장 큰 레버

ImageResolution (25–300 DPI)는 렌더링 시간과 이미지 크기에 모두 영향을 줍니다. 대부분의 포맷은 기본값이 200 DPI이며, 이미지와 PSD는 기본값이 100 DPI입니다.

csharp
// A document list preview doesn't need print quality
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(기본값 3000px)가 출력 크기를 제한합니다.

페이지 캐싱 — 메모리 vs. 재렌더링

BaseConfig.CachePages(기본값 true)는 세션 기간 동안 모든 렌더된 페이지를 메모리에 유지합니다. 이는 인터랙티브 뷰잉에 적합한 기본값이며, 사용자가 앞뒤로 스크롤할 수 있게 합니다. 다음 경우에 비활성화하십시오:

  • 문서가 매우 크고 한 번만 앞에서 뒤까지 보는 경우,
  • 다수의 동시 세션이 캐시된 페이지를 곱셈적으로 늘릴 경우,
  • RAM을 유지하기보다 뷰당 CPU 사용을 선호하는 경우.
csharp
var token = await viewer.OpenDocumentAsync(path, new PdfConfig { CachePages = false });

클라이언트에서는 ViewerConfig.CacheEnabled = true가 브라우저 메모리에 다가오는 페이지 이미지의 작은 이동 창을 미리 로드합니다. 이는 뷰당 프리패치 캐시이며, 지속적인 localStorage가 아닙니다.

세션 — 눈에 보이지 않는 메모리

열린 모든 세션은 파싱된 문서 모델과 (CachePages가 켜져 있다면) 렌더된 페이지를 유지하며, 슬라이딩 TimeOut(기본값 60분)이 마지막 요청 이후 경과할 때까지 유지됩니다. 다음 두 가지 습관으로 이를 관리할 수 있습니다:

  • 작업이 끝난 문서를 닫으세요. 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는 중요한 부분만 렌더링하도록 제한합니다.
  • Redirect 모드에는 초기 비용이 발생합니다: 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에 위치해야 합니다 — 요청마다 인코딩을 등록하는 것은 불필요한 작업이며, 이를 전혀 등록하지 않으면 레거시 코드 페이지 문서가 깨집니다.

튜닝 체크리스트

  1. ImageResolution을 UX가 허용하는 최저값으로 설정하십시오.
  2. 인터랙티브 뷰잉에서는 CachePages를 켜두고, 일회성 또는 고동시성 시나리오에서는 끄십시오.
  3. 세션을 명시적으로 닫고, 사용이 급증하는 경우 TimeOut을 짧게 설정하십시오.
  4. 큰 문서의 경우 클라이언트에서 LargeDoc와 기본값 AutoLoad = false를 사용하십시오.
  5. DefaultRender = false는 텍스트가 포함된 PDF 투영이 필요할 때만 사용하십시오.

이 페이지가 도움이 되었나요?