図面などを管理するシステムと連携して,図面のビューワを作成しています。
主に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
おはようございます。
サンプル作成をありがとうございます。こちらも3秒弱程度で実行されました。
シンプルなコードで実行する事でボトルネックが判明いたしました。
TIFFファイルなのですが,別サーバに保管しているため共有フォルダにアクセスしています。
ネットワークパスに変える事で,3秒⇒20秒になりました。
ローカルファイルアクセスでないと速度向上は難しいでしょうか?
こんにちは @kosuke_baba.rsg.kobe
ファイルはサーバーからローカルコンピューターにどのくらいの速さでコピーされますか? たぶん、ネットワークを介したデータ転送の速度に制限がありますか?
頂いたサンプルにて,
1.直接ローカルを処理するのに2.5秒,
2.ネットワークパスからだと20秒,
3.ネットワークパスからローカルコピーして処理すると,コピー含めても3秒
でした。
実行サンプルは下記です。
コピー処理の有無で,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
現時点での最善の解決策は、ファイルをメモリにコピーすることです。 同じファイルが複数回処理され、キャッシュがある場合、キャッシュは理にかなっています。 出力ファイルは、入力ファイル自体ではなく、キャッシュから取得されます。
以下は、キャッシュコードの例です。
最初からやり直す:処理に時間がかかる
後続の実行:キャッシュからフェッチされた結果
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)