refactor(P6): Independent 배치 병렬화 + Magick ResourceLimits (즉효 최적화)
순차 for-loop(멀티코어를 1코어만 사용)을 코어 수 병렬로 — 50장 배치가 코어 수만큼 가속. ConvertOptions 불변(P4)이라 공유 읽기 스레드 안전. 시그니처 불변(내부 교체). - ConversionEngine.ConvertManyAsync: Independent 분기를 Parallel.ForEachAsync(MaxDOP=BatchParallelism)로. 결과는 인덱스 고정 ConvertResult[]로 순서 보존. 진행률은 완료 건수(Interlocked.Increment)로 보고 (파일별 분수 진행률은 동시 실행에서 의미가 흐려짐). DOP<=1이면 기존 순차 경로(세부 진행률 보존). CombineToSingle은 단일 연산이라 병렬 대상 아님(기존대로). - ConvertOptions.BatchParallelism(기본 = 논리 코어 수) 추가 — 미디어 위주 배치는 낮춰 튜닝 가능. - MagickProvider 정적 생성자: ResourceLimits.LimitMemory(60%) — 병렬 시 동시 MagickImage OOM 방지 (초과분 디스크 스필, 출력 바이트 무영향). - 신규 테스트: 8장 병렬 배치의 순서 보존(results[i]↔sources[i]) + 전수 변환 검증. 71개 테스트 전부 그린(골든마스터 동일성 유지), 빌드 0경고/0오류. ⚠ 진행률 UX(완료 건수 모델) 변경 — GUI 스모크 권장.
This commit is contained in:
parent
379a4a738d
commit
729b9b699d
4 changed files with 73 additions and 13 deletions
|
|
@ -270,6 +270,34 @@ public class EngineCharacterizationTests
|
|||
Assert.True(img.HasAlpha); // png self-edge 최적화는 alpha 채널을 보존해야 한다
|
||||
}
|
||||
|
||||
// ── 시나리오 11: Independent 배치 병렬 변환 — 순서 보존 + 전수 변환 (P6) ──────────────────────
|
||||
[Fact]
|
||||
public async Task IndependentBatch_Parallel_PreservesOrderAndConvertsAll()
|
||||
{
|
||||
var dir = TempDir();
|
||||
var colors = new[]
|
||||
{
|
||||
MagickColors.Red, MagickColors.Lime, MagickColors.Blue, MagickColors.Yellow,
|
||||
MagickColors.Cyan, MagickColors.Magenta, MagickColors.White, MagickColors.Black,
|
||||
};
|
||||
var sources = new List<string>();
|
||||
for (var i = 0; i < colors.Length; i++)
|
||||
sources.Add(MakeSolidPng(dir, $"c{i}.png", colors[i], 24, 24));
|
||||
|
||||
var engine = Everything2EverythingBootstrap.CreateDefault();
|
||||
var results = await engine.ConvertManyAsync(sources, ".jpg", CustomOut(dir), batchMode: BatchMode.Independent);
|
||||
|
||||
Assert.Equal(sources.Count, results.Count);
|
||||
for (var i = 0; i < sources.Count; i++)
|
||||
{
|
||||
// 병렬이어도 results[i]는 sources[i]의 결과여야 한다(인덱스 고정 순서 보존).
|
||||
Assert.Equal(ConvertStatus.Success, results[i].Status);
|
||||
Assert.Equal(sources[i], results[i].SourcePath);
|
||||
Assert.Single(results[i].OutputPaths);
|
||||
Assert.True(File.Exists(results[i].OutputPaths[0]));
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>combine→pdf 경로로 2페이지 PDF를 만든다(순수 .NET, Ghostscript 불필요).</summary>
|
||||
private static async Task<string> BuildTwoPagePdf(string dir)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue