TIFFの表示を早くしたい

図面などを管理するシステムと連携して,図面のビューワを作成しています。
主にTIFFがあり,シングルページのものからマルチTIFFも存在しています。
またA1~A4までいろんなバリエーションがあります。
LoadOptions, ViewerSettings,JpgViewOptionsをいろいろ設定してみているのですが,
読み込み速度を向上する事は可能でしょうか?
使用しているバージョンは 20.11.0,DotNetでFW4.6.1のWindowsアプリです。

こんにちは @kosuke_baba.rsg.kobe

異なるページサイズの画像の TIFF ファイルの処理を高速化する必要がありますか?

パフォーマンスを測定するためのサンプルファイルとコードはありますか?

返信ありがとうございます。
プログラムの一部を抜粋しました。
このロジックで一番下のTIFFを処理すると20秒くらかかります。
実際の図面も2MBくらいのTIFFで同様の時間かかっています。

Dictionary<Int32, MemoryStream> pages = new Dictionary<Int32, MemoryStream>();
MemoryPageStreamFactory pageStreamFactory = new MemoryPageStreamFactory(pages);

FileType fileType = FileType.FromExtension(Path.GetExtension(zumen.FILE_NAME));
LoadOptions loadOptions = new LoadOptions(fileType);

ViewerSettings viewerSettings = new ViewerSettings(CustomViewerLogger.Get());

using(Viewer viewer = new Viewer(fullPath, loadOptions, viewerSettings)) {
JpgViewOptions viewOpts = new JpgViewOptions(pageStreamFactory);
viewer.View(viewOpts);
}

サンプルのTIFFは下記を使用しました。
https://www.fileformat.info/format/tiff/sample/1f37bbd5603048178487ec88b1a6425b/view.htm

Hi @kosuke_baba.rsg.kobe

どのCPU? どのくらいのRAM?

こんにちは @kosuke_baba.rsg.kobe

パフォーマンス測定アプリを添付しました。 このファイルは3秒で処理されました。

SampleApp.zip (2.5 MB)

おはようございます。
サンプル作成をありがとうございます。こちらも3秒弱程度で実行されました。
シンプルなコードで実行する事でボトルネックが判明いたしました。

TIFFファイルなのですが,別サーバに保管しているため共有フォルダにアクセスしています。
ネットワークパスに変える事で,3秒⇒20秒になりました。

ローカルファイルアクセスでないと速度向上は難しいでしょうか?

こんにちは @kosuke_baba.rsg.kobe

ファイルはサーバーからローカルコンピューターにどのくらいの速さでコピーされますか? たぶん、ネットワークを介したデータ転送の速度に制限がありますか?

頂いたサンプルにて,
1.直接ローカルを処理するのに2.5秒,
2.ネットワークパスからだと20秒,
3.ネットワークパスからローカルコピーして処理すると,コピー含めても3秒
でした。

こんにちは @kosuke_baba.rsg.kobe
サーバーからローカルコンピューターにファイルをコピーするのにどのくらい時間がかかりますか?

実行サンプルは下記です。
コピー処理の有無で,0.7秒くらいの差が出ています。

var sw = new Stopwatch();
sw.Start();

MemoryPageStreamFactory pageStreamFactory = new MemoryPageStreamFactory();

FileType fileType = FileType.FromExtension(Path.GetExtension(“MARBLES.TIF”));
LoadOptions loadOptions = new LoadOptions(fileType);

ViewerSettings viewerSettings = new ViewerSettings(new ConsoleLogger());

String pathLocal = “MARBLES.TIF”;
String pathNetwork = @"\[SERVER_NAME]\Documents#SCAN\MARBLES.TIF";
String pathCopied = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());

var mode = MODE.PATH_COPIED;

if(mode == MODE.PATH_COPIED) {
File.Copy(pathNetwork, pathCopied);
}

String path = mode == MODE.PATH_LOCAL ? pathLocal : mode == MODE.PATH_NETWORK ? pathNetwork : pathCopied;

using(Viewer viewer = new Viewer(path, loadOptions, viewerSettings)) {
JpgViewOptions viewOpts = new JpgViewOptions(pageStreamFactory);
viewer.View(viewOpts);
}

sw.Stop();

Console.WriteLine(“Time Taken: " + sw.Elapsed.TotalMilliseconds.ToString(”#,##0.00 ‘milliseconds’"));
//LOCAL: Time Taken: 2,091.04 milliseconds
//NETWORK: Time Taken: 35,077.98 milliseconds
//COPIED: Time Taken: 2,727.15 milliseconds

こんにちは @kosuke_baba.rsg.kobe

このコードの実行時間はどのくらいですか?

var sw = new Stopwatch();

String pathNetwork = @"[SERVER_NAME]\Documents#SCAN\MARBLES.TIF";
String pathCopied = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());

sw.Start();
File.Copy(pathNetwork, pathCopied);
sw.Stop();

Console.WriteLine(“Time Taken for file copy: " + sw.Elapsed.TotalMilliseconds.ToString(”#,##0.00 ‘milliseconds’"));

Time Taken for file copy: 1,069.50 ‘milliseconds’

となりました。

@kosuke_baba.rsg.kobe

この問題は、私たちの側で再現できます。 VIEWERNET-3093 で社内の問題追跡システムにログインしています。 更新があると、通知されます。

ご対応頂きありがとうございました!
修正されることをお待ちいたします。

このスレッドはクローズされますでしょうか?

@kosuke_baba.rsg.kobe
このスレッドは開かれます。 ここでお答えします

了解いたしました。
回答を心待ちにしておきます。

本件について,修正までに時間を要しているかと思いますが,
現バージョンにて表示を早くするテクニックなどあれば教えてください。
キャッシュの仕組みで解決可能でしょうか?

こんにちは@ kosuke_baba.rsg.kobe
現時点での最善の解決策は、ファイルをメモリにコピーすることです。 同じファイルが複数回処理され、キャッシュがある場合、キャッシュは理にかなっています。 出力ファイルは、入力ファイル自体ではなく、キャッシュから取得されます。

以下は、キャッシュコードの例です。
最初からやり直す:処理に時間がかかる
後続の実行:キャッシュからフェッチされた結果

string outputDirectory = @"C:\output";
string cachePath = Path.Combine(outputDirectory, "cache");
string pageFilePathFormat = Path.Combine(outputDirectory, "page_{0}.html");

FileCache cache = new FileCache(cachePath);
ViewerSettings settings = new ViewerSettings(cache);

using (Viewer viewer = new Viewer(@"C:\sample.docx", settings))
{
    HtmlViewOptions options = HtmlViewOptions.ForEmbeddedResources(pageFilePathFormat);

    Stopwatch stopWatch = Stopwatch.StartNew();
    viewer.View(options);
    stopWatch.Stop();
    Console.WriteLine("Time taken on first call to View method {0} (ms).", stopWatch.ElapsedMilliseconds);

    stopWatch.Restart();
    viewer.View(options);
    stopWatch.Stop();
    Console.WriteLine("Time taken on second call to View method {0} (ms).", stopWatch.ElapsedMilliseconds);
}

記事へのリンク

キャッシュプログラム例の紹介ありがとうございます。
以前に頂いたSampleAppにキャッシュを組み込んでみましたが,
キャッシュされるのは,どのファイルも「p1.png」となり,
複数のファイルをキャッシュすることができません。
なにか,設定が足らないのでしょうか? PNG表示ではキャッシュはできませんか?

ヒョウ@ kosuke_baba.rsg.kobe

遅れて申し訳ありませんが、キャッシュの問題を調査しました。 添付ファイルには、MD5ハッシュに基づいてファイルをキャッシュするアプリケーションがあります。
FileCache クラスには、サブフォルダーパラメーターを持つ追加のコンストラクターがあります。ここで使用する必要があります。

public FileCache(string cachePath, string cacheSubFolder)

キャッシュ内のファイルごとに個別のディレクトリがあります。 したがって、異なる形式に変換するときに、キャッシュ内の異なるファイルが複製されることはありません。 ご不明な点がございましたら、お書きください。 応答します。
SampleApp_MultipleFilesCache.zip (169.5 KB)