C言語関係掲示板

過去ログ

No.1144 高速計算プログラム

[戻る] [ホームページ]
No.14568

高速計算プログラム
投稿者---C言語練習中(2004/06/11 17:05:12)


あるファイルの中に8つの数字(-10000〜10000)が格納されていて
それを下のように計算し、新しいファイルに格納するプログラムを作りたいのですが、どのように作ったらよろしいでしょうか?
あと、この元データなのですが80万行くらいあるのですが、どうすれば
高速に処理できるかも教えていただけないでしょうか?

----------------------------------
a1 a2 a3 a4 a5 a6 a7 a8 ←空白で分けられている
b1 b2 b3 b4 b5 b6 b7 b8
   ・
   ・
   ・
上を下のように計算し格納していく

a1+(a2/60)+(a3/3600),a4+(a5/60)+(a6/3600),a7,a8
b1+(b2/60)+(b3/3600),b4+(b5/60)+(b6/3600),b7,b8
   ・
   ・
   ・
   
   


No.14570

Re:高速計算プログラム
投稿者---たいちう(2004/06/11 17:58:11)


高速に計算することが主題ですか?
数字に規則性がある、等の特殊な事情がないならば、
こんな簡単な計算に最適化の余地は殆どないでしょう。

# あまり関係ないかもしれませんが、読み込む数字は整数?
# 出力は整数?小数?精度は?

プログラム全体で時間がかかるのはファイルの入出力だと
思いますので、複数行(例えば1000行)読み込んでまとめて処理し、
まとめて書き込むようにして、ファイルのアクセス回数を減らすのは
有効だと思います。

高速化の前に1行ずつ処理できるプログラムを確実に作成しましょう。
10行くらいのテストデータを作ってね。

1)1行読み込む。
2)8つの数字に分割する。
3)計算する。
4)書き込む。
5)1)に戻る。

どれかできないことがありますか?


No.14576

Re:高速計算プログラム
投稿者---かずま(2004/06/11 22:35:50)


素直に書けば、

    double a1, a2, a3, a4, a5, a6, a7, a8;

    while (fscanf(stdin, "%lf%lf%lf%lf%lf%lf%lf%lf",
                &a1, &a2, &a3, &a4, &a5, &a6, &a7, &a8) == 8)
        fprintf(stdout, "%.16g,%.16g,%.16g,%.16g\n",
                a1 + a2*(1.0/60) + a3*(1.0/3600),
                a4 + a5*(1.0/60) + a6*(1.0/3600), a7, a8);

高速化したければ、ファイルをメモリにマップする。
ただし、Windows と Unix ではやり方が違うので、ここでは概要だけ。
速いかどうかは実際に測定してみないとなんとも言えませんが。

    char *p = mem_map(FILENAME);
    char *end = p + filesize(FILENAME);

    while (p <end) {
        a1 = strtod(p, &p); a2 = strtod(p, &p); a3 = strtod(p, &p);
        printf("%.16g,", a1 + a2*(1.0/60) + a3*(1.0/3600));
        a1 = strtod(p, &p); a2 = strtod(p, &p); a3 = strtod(p, &p);
        printf("%.16g,", a1 + a2*(1.0/60) + a3*(1.0/3600));
        a1 = strtod(p, &p); a2 = strtod(p, &p);
        printf("%.16g,%.16g\n", a1, a2);
    }



No.14615

Re:高速計算プログラム
投稿者---C言語練習中(2004/06/14 11:04:17)


かずまさんのプログラムを元にして。ファイル「〜.dat」を読み込んで処理し「〜.out」というファイルを作ったつもりなんですが、まだ動きません。
どこがおかしいのでしょうか?

#include&lt;stdio.h&gt;
#include&lt;stdlib.h&gt;

main()
{
FILE *fin,*fout;
char filename[256];
char infile[256];
char outfile[256];
float a1, a2, a3, a4, a5, a6, a7, a8;

printf(&quot;ファイル名入力=&quot;);
scanf(&quot;%s&quot;,filename) ;
strcpy(infile,filename);
strcat(infile,&quot;.dat&quot;);
strcpy(outfile,filename);
strcat(outfile,&quot;.out&quot;);

if((fin=fopen(infile,&quot;r&quot;))==NULL){
printf(&quot;%s is not found.&quot;,infile);
exit(1);
} else printf(&quot;%s\n&quot;,filename);

while (fscanf(fin, &quot;%lf%lf%lf%lf%lf%lf%lf%lf&quot;,
&amp;a1, &amp;a2, &amp;a3, &amp;a4, &amp;a5, &amp;a6, &amp;a7, &amp;a8))
fprintf(fout, &quot;%.16g,%.16g,%.16g,%.16g\n&quot;,
a1 + a2*(1.0/60) + a3*(1.0/3600),
a4 + a5*(1.0/60) + a6*(1.0/3600), a7, a8);


if((fout=fopen(outfile,&quot;w&quot;))==NULL){
printf(&quot;%s is not found.&quot;,outfile);
exit(1);
} else printf(&quot;%s\n&quot;,outfile);


}




No.14618

Re:高速計算プログラム
投稿者---REE(2004/06/14 13:41:26)


>かずまさんのプログラムを元にして。ファイル「〜.dat」を読み込んで処理し「〜.out」というファイルを作ったつもりなんですが、まだ動きません。
>どこがおかしいのでしょうか?

プログラムは化けているので見ていませんが、
期待通りに動かないのであれば、どのように期待と違うのか明記してください。
それとも、回答者に確認させたいのですか?