他のアプリケーションからの数値の受け渡し

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
FT田中

他のアプリケーションからの数値の受け渡し

#1

投稿記事 by FT田中 » 5年前

こんにちは。
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);
という風に実行させています。
この工程がメインループ中に複数個あり、何回も実行されているため遅くなっているのだと思いますが、何か解決法はございますでしょうか。よろしくお願い致します。

初級者
記事: 200
登録日時: 9年前

Re: 他のアプリケーションからの数値の受け渡し

#2

投稿記事 by 初級者 » 5年前

どういうスペックのマシンで
どのくらいのデータを読んだとき
何秒くらいかかるので

遅いと判断されているのか、
定量的にお願いします。

FT田中

Re: 他のアプリケーションからの数値の受け渡し

#3

投稿記事 by FT田中 » 5年前

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秒程度かかります。

初級者
記事: 200
登録日時: 9年前

Re: 他のアプリケーションからの数値の受け渡し

#4

投稿記事 by 初級者 » 5年前

メインループに同じ処理が
24個ある、というのは
必須ですか?

プログラムの設計を
見直す必要はないでしょうか。

初級者
記事: 200
登録日時: 9年前

Re: 他のアプリケーションからの数値の受け渡し

#5

投稿記事 by 初級者 » 5年前

もしかして、24時間分の
データだから24回、という
ことですか?

FT田中

Re: 他のアプリケーションからの数値の受け渡し

#6

投稿記事 by FT田中 » 5年前

データを読み取る際にコマンドの文字列を毎回変更する必要があり(コマンドラインで座標データを指定し、その点でのデータを表示する)、
1回で1つの座標のデータしか読み取れないため、現状こうなっています。
24回というのは、
立方体のように、ある座標を囲む8点*2回と、正方形の格子状の4点*2回分のデータが必要となるためです。
popen,pcloseを毎回実行するため、これがネックになっているのかと考えていますが、解決法がわかりません。

初級者
記事: 200
登録日時: 9年前

Re: 他のアプリケーションからの数値の受け渡し

#7

投稿記事 by 初級者 » 5年前

パイプのオープン・クローズを
毎回実行するのは、必須ですか?

FT田中

Re: 他のアプリケーションからの数値の受け渡し

#8

投稿記事 by FT田中 » 5年前

正直、パイプを使ったプログラミングはこれが初めてで、使い方がいまいちよくわかっていません。
例えば、ファイル読み書きと同じく、同じ(バイナリ)ファイルに対して行う操作は一回のオープンで可能なのでしょうか。
または、同じアプリケーションへのパイプ(ここでは、wgrib2)は一回で良いなど・・・。
この操作(24回)は同じバイナリファイルに対して行う部分も幾つかあるので、上記のことができればオープン・クローズの回数が減らすことができます。

アバター
みけCAT
記事: 6252
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: 他のアプリケーションからの数値の受け渡し

#9

投稿記事 by みけCAT » 5年前

FT田中 さんが書きました:バイナリファイルはひとつ40~60MB程度の大きさです。読みだすデータは50文字*5~6行のテキストデータです。
開発環境はVisualStudio2012で、デバッグモードで実行すると上記の動作は一瞬で終わります。
これと同等の動作がメインループ中に24回あり、メインループ一回で4秒程度かかります。
4÷24≒0.16ですが、これを「一瞬」と感じるかは個人の感覚によると思います。
そのため、ループすることによって遅くなっているか、そうでないかはわかりません。
(きちんと「上記の動作」の実行時間を測定してくれれば別ですが)
また、目標の実行時間は何秒くらいですか?
FT田中 さんが書きました:popen,pcloseを毎回実行するため、これがネックになっているのかと考えていますが、解決法がわかりません。
考えているだけですか?
何もせずに終了するだけのプログラムをpopen,pcloseするプログラムと比較するなどの実験はしましたか?
オフトピック
メモ:wgrib2についての説明
http://air.geo.tsukuba.ac.jp/~hayasaki/ ... use_wgrib2
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

FT田中

Re: 他のアプリケーションからの数値の受け渡し

#10

投稿記事 by FT田中 » 5年前

何もせずpopen,pcloseするプログラムで試したところ、かかる時間はwgrib2を用いているプログラムとあまり時間は変わらないようでした。
ご指摘のとおり、24回呼び出すアルゴリズムを見直すべきであると分かりました。
別のアプローチを考えることにします。

初級者さん、みけCATさん、ご回答ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る