Matlabの「印刷」機能をスピードアップする方法
-
26-10-2019 - |
質問
MATLABでかなり大きなデータ収集プログラムを作成しました。これは、かなり厳しいタイミングスケジュールで入力データを受信し、GUIでリアルタイムでプロットしています。私の問題は、プログラムのユーザーがWeb上でGUIを表示してデータをリモートで監視する方法が必要だということです。私の解決策は、5秒ごとにGUIフィギュアのスナップショットを撮影し、その画像をWebサーバーでホストすることでした。
ただし、これは2つの容認できない問題につながります。
印刷機能は単純に遅すぎます。各セーブごとに〜3〜4秒かかり、その後、プログラムは「印刷」へのコールのたびに他のルーチンに遅れをとります。
何らかの理由で、印刷機能によりGUIが一時的に歪んでおり、一部のコンポーネントの位置を変更し、他のコンポーネントを複製します。それはわずか1秒ほど続きますが、それでも私の解決策を非現実的にします。
これらの問題のいずれかを解決する方法はありますか?
編集:*** 興味のある人にとって、私が見つけた最良の解決策は、外部ツールキットを使用することでした ミニキャップ.
解決 2
将来これに苦労している人にとって、私がWindowsプラットフォームのために着陸したソリューションは、呼ばれる小さなプログラムです ミニキャップ これにより、システムコマンドを使用してスクリーンショットを簡単にキャプチャして保存できます。
図の基礎となるWindowsハンドルを持つ必要があります。これは、呼ばれる公開されているMATLAB関数を使用してアクセスできます。 gethwnd()
スーパーユーザーYair M. Altmanによって書かれました。
その後、フィギュアの非常に高速で高解像度のスクリーンショットを取り、次のようなものでディスクに保存できます。
winHandle = gethwnd(matlabFigHandle);
cmndstr = sprintf('%s','MiniCap.exe -save ','"',snapShotFileNamePath,'"',...
' -compress 9', ' -capturehwnd ', num2str(winHandle),' -exit');
system(cmndstr);
他のヒント
ファイル形式は大きな違いをもたらします。これがサンプル散布図です
n = 1e4;
hfig = figure;
hax = plot(1:n, rand(1, n), '+');
...そして、さまざまな形式に保存するためのいくつかのタイミング。
tic; print(hfig, 'test.bmp', '-dbmp'); toc %4.1s
tic; print(hfig, 'test.bmp', '-dbmp256'); toc %2.0s
tic; print(hfig, 'test.png', '-dpng'); toc %1.9s
tic; print(hfig, 'test.tiff', '-dtiff'); toc %0.45s
tic; print(hfig, 'test.jpg', '-djpeg'); toc %0.44s
tic; print(hfig, 'test.wmf', '-dmeta'); toc %0.42s
tiff
, jpeg
と wmf
TIFFファイルは巨大ですが、JPEGの品質はひどく、WMFにはWindowsプラットフォームにいない場合はWMFがあります。
ラスター形式の場合、解像度もタイミングに影響します。
tic; print(hfig, 'test600.png', '-dpng', '-r600'); toc %4.2s
tic; print(hfig, 'test72.png', '-dpng', '-r72'); toc %0.31s
印刷をスピードアップするもう1つのことは、必要のないプロットの小片を削除することです。透明性は計算的にインスティブであるため、伝説も同様です。データをすべてプロットするのではなくサンプリングすると、時間も節約できます。
あなたのソリューションは純粋なマトラブでなければなりませんか?プラットフォームツールキットを使用して、GUIを保持しているウィンドウのスナップショットを取得し、ディスクに書き込みます。それは非常に速く、別のスレッドにあるので、スレッドの問題を処理するはずです。
おそらく常にキャプチャするのではなく、実際にリクエストがWeb上で行われた場合にのみキャプチャする必要があります。それでも、各リクエストに対してキャプチャしないで、最後のスナップショットが5秒以上古い場合のみです。それはパフォーマンスを支援するために大いに役立つはずです。
あなたは出来る saveas()
aとしてのあなたの姿 .fig
MATLABインスタンスが計算を行うと、ファイル(かなり速いはずです)を使用して、別のMATLABインスタンス(おそらく別のコンピューターで)を使用して print
必要な形式に。これにより、他のルーチンの遅延を避け、印刷によって引き起こされる歪みは「メイン」MATLABインスタンスでは発生しません。
ご了承ください print
特定のケースのために捨てることができるものがあるかどうかを確認するために調べることができる.mファイルです。たとえば、呼び出します private/prepare.m
私はあなたが話している歪み /位置の変更を引き起こすと思います...多分あなたはこれで遊ぶことができますか?
アップデート: :データはあります 持ってる Webインターフェイスを通過するには?ユーザーベースが十分に小さい場合は、VNC、TeamViewer、またはWindowsに組み込まれたターミナルサーバーのものなど、データをリモートで表示するためのリモートデスクトップソフトウェアを使用するように教えることで逃げようとすることができますか?