gnuplotのフリーズについて

このQ&Aのポイント
  • C++で作成したプログラムでgnuplotを呼び出し、リアルタイムで描画をさせています。時折gnuplotの描画が止まってしまいます。
  • プログラム内で同時に命令しているデータの記録は継続されるので、gnuplotのフリーズのみの症状となります。
  • サンプリング間隔・描画間隔の変更、描画データの間引きなどを試しましたが改善できていません。
回答を見る
  • ベストアンサー

gnuplotのフリーズについて

C++で作成したプログラムでgnuplotを呼び出し、リアルタイムで描画をさせています。 データを計測しつつその変化をgnuplotのグラフで確認しているのですが、時折gnuplotの描画が止まってしまいます。 フリーズの状況は規則性がないようで、開始してすぐであったり、しばらくしてから止まったりです。 プログラム内で同時に命令しているデータの記録は継続されるので、gnuplotのフリーズのみの症状となります。 プログラムソースは長くなるのでとりあえず省きますが、プログラムの流れとしては データをサンプリング→プログラム内で計算→csv形式で出力→csvファイルを読み込んでgnuplotで描画 という形の繰り返しです。 動作環境はWindowsXPでプログラムはC++ Builder6で作成しました。 サンプリング間隔・描画間隔の変更、描画データの間引きなどを試しましたが改善できていません。 同様の症状、その解決策をご存じの方がいらっしゃいましたら、教えて頂けないでしょうか。 参考までに実行画面の画像を添付しました。縦軸がデータ値、横軸が経過時間です。 不足している情報などありましたら合わせてご連絡ください。 どうぞよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • ki073
  • ベストアンサー率77% (491/634)
回答No.1

gnuplotがデータをファイルで読んでいることが何か怪しそうです。ファイルが完全に閉じられないうちに、gnuplotが読み始めて破綻しているような気もします。 ともかくデータもパイプで渡された方が安全だと思います。 安定性とは関係ありませんが、CSVではなく空白で区切ったデータの方が良いと思います。 パイプで渡して破綻しないか試してみましたが、安定していますよ。 Windowsで同じ環境をつくるのが大変なので、Mac+Rubyでの例を書いておきます。Windowsの場合はパイプ対応のgnuplotは別になっているようなことを見た覚えがあります。 x=(0..100).collect{|a| a*0.01} open("|gnuplot", "w"){|gp| 10000.times{ y=x.collect{|a| rand()}.sort gp.puts "plot '-'" x.zip(y){|x1, y1| gp.puts "#{x1} #{y1}"} gp.puts "e" sleep 0.1 } }

128d8515
質問者

お礼

回答ありがとうございます。 ただ、パイプでやる方法も以前試したのですが、動作はしたものの同様の症状が発生していました。 その際に「データ数が多い場合、パイプ方法よりcsv書き出し・読み込み方法の方が安定する」という話を聞いたため現在の流れにしています。 とにかくご指摘の部分を試してみたいと思います。 試行までしていただきありがとうございます。

その他の回答 (2)

  • ki073
  • ベストアンサー率77% (491/634)
回答No.3

sleepで改善がみられましたか。 >ただ私のプログラムの場合、描画指令の後ではなく前でないと効果がありませんでした。 >環境あるいはプログラム構成の違いのせいでしょうか。 多分環境でしょう。描画命令の前に入れて効果が出る方が自然なように思います。こちらはなぜか後ろに入れないと効果がありませんでした。 sleepの挿入が許される程度の時間待ちがあっても良いのでしたら、そうゆう解決法も良いのではないかと思います。 多分ディスクアクセス速度に依存するはずですので、余裕を持たせた値にしましょう。 パイプを使う方がそのような問題が出にくいので安心なのですが、環境によってパイプに起因するような問題点があるのかもしれません。

128d8515
質問者

お礼

丁寧な回答、試行ありがとうございました。 頂いた回答をもとにより良いものにしていきたいと思います。

  • ki073
  • ベストアンサー率77% (491/634)
回答No.2

No.1のお礼欄をもとにもう少しテストをしてみました。 ファイルに書き出すのもやってみました。フリーズはしませんでしたが見事にデータの読み込みがおかしく警告がでます。 gnuplotの後ろにsleepを入れて待たせてやると大丈夫なようです。(gnuplotの前では効果がなかった) どうもディスクアクセスが絡んでいるようです。パイプの方はデータ数をかなり増やしてみました問題はありませんでした。 あくまでもMacでの結果ですので、OS依存があるかも知れません。 パイプを使ったもの、正常に動きました。 x=(0..1000).collect{|a| a*0.01} open("|gnuplot", "w"){|gp| 10000.times{|i| gp.puts "plot '-' with lines, '-' with lines, '-' with lines, '-' with lines, '-' with lines, '-' with lines, '-' with lines, '-' with lines" 8.times{|j| y=x.collect{|a| rand()*j}.sort x.zip(y){|x1, y1| gp.puts "#{x1} #{y1}"} gp.puts "e" } puts i } } ディスクに書き出すもの、sleepが無いと駄目です。USBメモリなどに書き出すと、もっと待たないと駄目。 x=(0..1000).collect{|a| a*0.01} open("|gnuplot", "w"){|gp| 10000.times{|i| data=8.times.collect{|j| x.collect{|a| rand()*j}.sort } data=data.transpose open("data.txt", "w"){|fo| x.zip(data){|x0, y| fo.print "#{x0} " fo.puts y.join(" ") } } gp.puts "plot 'data.txt' using 1:2 with lines, 'data.txt' using 1:3 with lines, 'data.txt' using 1:4 with lines, 'data.txt' using 1:5 with lines, 'data.txt' using 1:6 with lines, 'data.txt' using 1:7 with lines, 'data.txt' using 1:8 with lines, 'data.txt' using 1:9 with lines" puts i sleep 0.5 } }

128d8515
質問者

お礼

試行までしていただきありがとうございます。 おっしゃるように書き出し方式でSleep関数を入れるとかなり改善しました。 詳しい知人と検討したところ「データのサンプリングと書き出し・読み込み・描画のタイミングが合っていなかったのでは?」という話が出ました。 Sleepを入れることでそのあたりが解消されるのかもしれません。 ただ私のプログラムの場合、描画指令の後ではなく前でないと効果がありませんでした。 環境あるいはプログラム構成の違いのせいでしょうか。

関連するQ&A

  • gnuplotの質問です。

    手元に10000行1列の各数字が0 ~ 20範囲のデータがあります。 横軸に 0~5 5~10 10~15 15~20の各範囲、縦軸にそれぞれの範囲内にある数の個数の4本の棒グラフを作成したいのですが、gnuplotで可能でしょうか。 調べてみますと、gnuplotだけではこの様なことはできないと書いてある頁があったのですが疑問に思ったので質問させていただきました。

  • gnuplotので、複数の物理量を縦に並べたい

    時間ごとに、降雨量と受信電力のデータがあります。下記の通りです。 時間(hour) 降雨量(mm/h) 受信電力(dbm) 2.000 3.0 -86.10 2.167 15.0 -90.64 2.333 21.0 -87.25 2.500 6.0 -84.04 時間をx, 降雨量y1, 受信電力y2として、 X vs Y1、X vs Y2のグラフはそれぞれ作成に成功しました。 X vs Y1, X vs Y2のグラフを一つに表示したいです。 イメージその1 横軸:hour, 左縦軸:mm/h 右縦軸:dbm イメージその2 下のグラフ 横軸:hour 縦軸:mm/h 上のグラフ 横軸:hour 縦軸:dbm ちなみにlinux上のgccからgnuolotを使っています。 今後はTEXへの貼り付けも考えています。 gnuplotで、複数の物理量をたてに並べる方法を教えてください。 また、gnuplot以外の方法もあるのでしたら教えてください。

  • gnuplotについて

    以前、こちらでgnuplotのデータをファイルに出力する方法を教えていただいたものです。 以下のようにやってみたのですが、 gnuplot> set yrange [0:5] gnuplot> plot "h1.txt","h4.txt" gnuplot> set terminal postscript eps Terminal type set to 'postscript' Options are 'eps noenhanced monochrome blacktext \ dashed dashlength 1.0 linewidth 1.0 defaultplex \ palfuncparam 2000,0.003 \ butt "Helvetica" 14' gnuplot> set output 'h20.eps' gnuplot> replot epsファイルが出来ただけで、開くことが出来ません。 開こうとすると『作成元のプログラム名が必要です。インターネットで自動的にプログラムを検索するか、またコンピューターにあるプログラム一覧から手動で選択してください。』と出ます。 どうすれば、開くことが出来るのでしょうか? 印刷のためのファイルなので、開くことは出来ないのでしょうか?

  • Javaからパイプでデータ送信しGnuplot描画

    大変お世話になります。 以下のスロットで、Javaから単純にGnuplotのsin(x)コマンドを実行させ、描画される方法が紹介されていました。 http://okwave.jp/qa/q5427703.html 今回、上記の改良として以下の2点についてご質問させて頂けますでしょうか。 1)Java側で、例えば y=sin(x) の、x値(for文により生成)、y値を計算させ表示。 同時にこの、x値、y値を(多分)パイプ経由で、Gnuplot側に送りそれを描画させる方法。 (Javaから"plot sin(x)"を指示するのではなく、Gnuplotにはデータ値を送付) 2)及び上記描画(プロット)表示を、アニメーション的に描画される方法。 多分、こちらもJava側でGnuplot向けの描画コマンド中にfor文を用意し、x値とそのy値のセットを順次・動的にGnuplot側に送り出す事が必要と思います。 (C言語では同様のアニメーション表示が出来ている記載が別webにあり、sin(x)波がニョロニョロと動くように描画されています) http://ayapin-film.sakura.ne.jp/LJ/Docs/40th.pdf http://www.eng.kagawa-u.ac.jp/~haruna/memo/gnuplot/gnuC.html http://kabuto.phys.sci.osaka-u.ac.jp/~yuhii/pc/gnuplot_animation.html 以上2点をご存知でしたら、教示して頂きたいと思います。 ご理解頂ける方がいらっしゃいましたら、ご指導宜しくお願い致します。

  • C言語を用いて、GNUPLOTでリアルタイムにグラフ化方法について。

    C言語を使用して、GNUPLOTを呼び出し、時間とともに更新されていくデータをリアルタイムでグラフ化しようと思っていますが、なかなかうまくいきません。 私が考えていた簡単なプログラムのシーケンスとして、(OSはLinuxです。) ~データの作成~  fopen;データファイルの作成  fprintf;/データの作成  fclose;/データの保存 ~グラフ化~  popen;/GNUPLOTの呼出  fprintf(---,”plot \”[作成したデータファイル]\”\n”);/グラフ化 ~データの更新~  fopen;  fprintf;  fclose;/データの上書き ~グラフの更新~  fprintf(---,”reread\n”);/データの再読み込み  fprintf(---,”replot\n”);/グラフの更新 ~データの更新~ ~グラフの更新~ ・・・/ループ  pclose;/GNUPLOTの終了 と、データを更新したら、グラフ化をしていく予定でした(汗)。 テスト的に10回だけデータの更新をするプログラムを動作させると、 データの更新を先に全部行ってしまい、グラフ化されるのが、最後の更新データのみでした。 どのようにしたら、リアルタイムにデータをプロットできるでしょうか?? よろしくお願い致します。

  • エクセルでグラフを作る

    エクセルでグラフを作っているのですが、 方法がわからず、困っていることがあります。 簡単に言うと、 横軸が1,2,4,5・・・・の時の 縦軸の値はわかっているのですが、 横軸が3の時の縦軸の値がわからないので 入力しないままでグラフを作成すると、 横軸が1,2,4,5・・・・が等間隔で並びます。 これをなんとかして、横軸に3を含ませて、 その時の縦軸の値を周りの値から予想させて グラフを作りたいのですが、それはできませんか? 表をいじくらなければ、それはできないのでしょうか?

  • [VBA]グラフを作りたいです!(^-^v

    教えて下さい。 テキストファイルの内容を元に自動的グラフを作りたいです。 【C:\Temp\data.csv】の中身 ----------------------------------- 1回目,10.50% 2回目,30.45% 3回目,70.45% ----------------------------------- 横軸には「n回目」の文字列を、縦軸には「n%」数値を入れたいです。 なんとか静的にグラフを作ることは出来ましたが、これを自動化したいと思っています。 【サンプルvba】 ----------------------------------- Private Const LOGFILE = "C:\Temp\data.csv" Private Sub CommandButton1_Click() ' グラフオブジェクト作成(位置,サイズ) With Sheet1.ChartObjects.Add(10, 50, 400, 150).Chart .ChartType = xlLine ' 折れ線グラフ .Axes(xlValue).MaximumScale = 100 ' 縦軸最大値 .Axes(xlValue).MinimumScale = 0 ' 縦軸最小値 ' グラフデータ内容 With .SeriesCollection.NewSeries ' グラフ名 .Name = "テスト" ' 縦軸 (ここに%数値を入れたい) .Values = "={10.50,30.45,70.45}" ' 横軸 (ここに回数を入れたい) .XValues = "={""1回目"",""2回目"",""3回目""}" End With End With End Sub ----------------------------------- テキストファイルの内容は一定間隔で更新されるため自動的に取り込みたいです。 すいませんがよろしくおねがいします、、。(T▽T)ノ

  • Excelグラフの軸

    エクセルでグラフをつくろうとしています。 添付した画像を見ていただきたいのですが、 縦軸はD列、横軸はC列の値にしたいと思っています。 縦軸はいいのですが、 横軸で、値と、グラフの間隔がおかしくなってしまいます。 例えば、一番右の1と0.62の幅と左の0と0.02の幅が同じになってしまいます。 これはどのようにすればきちんとした間隔にすることができるのでしょうか。 教えてください。よろしくお願いいたします。

  • エクセルで階段状のグラフの作成

    横軸の値が 10 100 300 1000 それに対する縦軸の値が 100 90 70 0 となっているときに,グラフの横軸は1000まで1刻みで階段状のグラフを作成したいのですが方法がわかりません 縦軸の値は横軸10まではずっと100、11から100までは90…となっており、縦軸の値が変わる境界値が横軸というイメージです 100 100 100 100 100 100 100 100 100 100 90 90 90 90 90 90… のように1から1000まで1刻みでデータがあればできるのですが… 実際のデータは1000までではなく数千万個ほどでわざわざ同じデータをコピーするのも大変なので、なにかいい方法はないでしょうか? エクセル2013です よろしくお願いいたします

  • 時間とデータが飛んでしまう?

    現在C言語でプログラムを製作しあるデータ取りを行っているのですが、これを時間を横軸にデータを縦軸にしてグラフにすると所々カクカクになって、データが飛んでいます。どうしてなのでしょうか?これを解決する方法はないのでしょうか?

専門家に質問してみよう