ページ 1 / 1
他のアプリケーションからの数値の受け渡し
Posted: 2014年7月06日(日) 17:27
by FT田中
こんにちは。
wgrib2 という、バイナリ形式の気象データからデータを抽出し、コマンドライン上でデータを表示するアプリケーションと連携するC++アプリケーションを作っているのですが、実行速度が非常に遅いです。
現在は、
コード:
sprintf(command,"wgrib2 WeatherData/....");
if((pp = _popen(command,"r"))==NULL)exit(1);
fgets(Buff,255,pp);
strtemp = strstr(Buff,"val=");
srHGT[0] = atof(strtemp+4);
_pclose(pp);
という風に実行させています。
この工程がメインループ中に複数個あり、何回も実行されているため遅くなっているのだと思いますが、何か解決法はございますでしょうか。よろしくお願い致します。
Re: 他のアプリケーションからの数値の受け渡し
Posted: 2014年7月06日(日) 17:32
by 初級者
どういうスペックのマシンで
どのくらいのデータを読んだとき
何秒くらいかかるので
遅いと判断されているのか、
定量的にお願いします。
Re: 他のアプリケーションからの数値の受け渡し
Posted: 2014年7月06日(日) 18:28
by FT田中
Windows 7 Home Premium 64-bit (6.1, Build 7601) Service Pack 1 (7601.win7sp1_gdr.140303-2144)
Intel(R) Core(TM) i7 CPU 860 @ 2.80GHz (8 CPUs), ~2.8GHz
12288MB RAM
バイナリファイルはひとつ40~60MB程度の大きさです。読みだすデータは50文字*5~6行のテキストデータです。
開発環境はVisualStudio2012で、デバッグモードで実行すると上記の動作は一瞬で終わります。
これと同等の動作がメインループ中に24回あり、メインループ一回で4秒程度かかります。
Re: 他のアプリケーションからの数値の受け渡し
Posted: 2014年7月06日(日) 18:32
by 初級者
メインループに同じ処理が
24個ある、というのは
必須ですか?
プログラムの設計を
見直す必要はないでしょうか。
Re: 他のアプリケーションからの数値の受け渡し
Posted: 2014年7月06日(日) 18:51
by 初級者
もしかして、24時間分の
データだから24回、という
ことですか?
Re: 他のアプリケーションからの数値の受け渡し
Posted: 2014年7月06日(日) 19:10
by FT田中
データを読み取る際にコマンドの文字列を毎回変更する必要があり(コマンドラインで座標データを指定し、その点でのデータを表示する)、
1回で1つの座標のデータしか読み取れないため、現状こうなっています。
24回というのは、
立方体のように、ある座標を囲む8点*2回と、正方形の格子状の4点*2回分のデータが必要となるためです。
popen,pcloseを毎回実行するため、これがネックになっているのかと考えていますが、解決法がわかりません。
Re: 他のアプリケーションからの数値の受け渡し
Posted: 2014年7月06日(日) 21:08
by 初級者
パイプのオープン・クローズを
毎回実行するのは、必須ですか?
Re: 他のアプリケーションからの数値の受け渡し
Posted: 2014年7月06日(日) 21:37
by FT田中
正直、パイプを使ったプログラミングはこれが初めてで、使い方がいまいちよくわかっていません。
例えば、ファイル読み書きと同じく、同じ(バイナリ)ファイルに対して行う操作は一回のオープンで可能なのでしょうか。
または、同じアプリケーションへのパイプ(ここでは、wgrib2)は一回で良いなど・・・。
この操作(24回)は同じバイナリファイルに対して行う部分も幾つかあるので、上記のことができればオープン・クローズの回数が減らすことができます。
Re: 他のアプリケーションからの数値の受け渡し
Posted: 2014年7月06日(日) 21:46
by みけCAT
FT田中 さんが書きました:バイナリファイルはひとつ40~60MB程度の大きさです。読みだすデータは50文字*5~6行のテキストデータです。
開発環境はVisualStudio2012で、デバッグモードで実行すると上記の動作は一瞬で終わります。
これと同等の動作がメインループ中に24回あり、メインループ一回で4秒程度かかります。
4÷24≒0.16ですが、これを「一瞬」と感じるかは個人の感覚によると思います。
そのため、ループすることによって遅くなっているか、そうでないかはわかりません。
(きちんと「上記の動作」の実行時間を測定してくれれば別ですが)
また、目標の実行時間は何秒くらいですか?
FT田中 さんが書きました:popen,pcloseを毎回実行するため、これがネックになっているのかと考えていますが、解決法がわかりません。
考えているだけですか?
何もせずに終了するだけのプログラムをpopen,pcloseするプログラムと比較するなどの実験はしましたか?
Re: 他のアプリケーションからの数値の受け渡し
Posted: 2014年7月06日(日) 22:59
by FT田中
何もせずpopen,pcloseするプログラムで試したところ、かかる時間はwgrib2を用いているプログラムとあまり時間は変わらないようでした。
ご指摘のとおり、24回呼び出すアルゴリズムを見直すべきであると分かりました。
別のアプローチを考えることにします。
初級者さん、みけCATさん、ご回答ありがとうございました。