数字データが入ったCSVファイルを計算処理するために、読み込んで2次元配列に
格納するプログラムを書いたのですが、ものすごく時間が掛かって困っています。
CSVファイルは32768行、2048列、合計で67108864点もの数字が入っていて下記のように
1行読み込んで「,」で区切り数字にして格納するようなプログラムで回してみると
ファイルを読み込みだけで1時間半くらい掛かってしまいます。
CPUはi7-860でメモリ4GBあります。
もっと早く読み込める方法、良いプログラムを教えていただきたいのですが
C言語に詳しい方、何卒ご教授お願いします。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define A 2048/
#define Lnum 32768
#define B 3
#define T ','
int N,k;
double x[Lnum][A],o[A][B],a,b,c,d,e,f,g,h,rms[A],skw[A],kur[A];
char st2[]=".csv";
char st3[100];;
char st1[100];
char str[100];
char str2[100];
char str3[100];
FILE *IN1,*IN2,*OUT;
int main(){
printf("検定ファイル名を入力してください\n");
printf("例(neko.csv→neko)\n");
gets(st1);
printf("よみこんだんよ\n");
printf("輝度値ファイル名を入力してください\n");/*67108864点のCSVファイル*/
printf("例(neko.csv→neko)\n");
gets(st3);
printf("よみこんだんよ\n");
sprintf_s(str,"%s%s",st1,st2);
IN1=fopen(str,"r");
sprintf_s(str2,"%s%s",st3,st2);
IN2=fopen(str2,"r");
char line[128], *ptr;
int i, j;
i=0;
while (fgets(line, 128, IN1) != NULL) {
ptr = line; j=0;
do{
//line[j]から次のタブ文字までを数値に変換
o[i][j] = atof(ptr);
//次のタブ文字の位置を探す
ptr = strchr(ptr, T);
//タブ文字の次の文字を示す
if (ptr!=NULL) { ptr++; }
j++;
}while(ptr!=NULL && j<B);
i++;
}
/*問題の読み込み部分*/
char line1[16384], *ptr1;
i=0;
while (fgets(line1, 16384, IN2) != NULL) {
ptr1 = line1; j=0;
do{
//line[j]から次のタブ文字までを数値に変換
x[i][j] = atof(ptr1);
//次のタブ文字の位置を探す
ptr1 = strchr(ptr1, T);
//タブ文字の次の文字を示す
printf("x1(%d,%d)\n",i,j);
if (ptr1!=NULL) { ptr1++; }
j++;
}while(ptr1!=NULL && j<A);
i++;
}
/*問題の読み込み部分終わり*/
//計算部分
for(unsigned int i=0;i<A;i++){
for(unsigned int j=0;j<Lnum;j++){
x[j][i]=(-o[i][1]+sqrt(o[i][1]*o[i][1]-4*o[i][0]*(o[i][2]-x[j][i])))/(2*o[i][0]);
}
}
a=0;
b=0;
c=0;
d=0;
e=0;
for(unsigned int i=0;i<A;i++){
for(unsigned int j=0;j<Lnum;j++){
e += x[j][i];
}
a = e/Lnum;
for(unsigned int j=0;j<Lnum;j++){
b += pow(x[j][i]-a,2);
c += pow(x[j][i]-a,3);
d += pow(x[j][i]-a,4);
printf("x2(%d,%d)\n",j,i);
}
rms[i] = sqrt(b/Lnum);
skw[i] = c/(Lnum*pow(rms[i],3));
kur[i] = d/(Lnum*pow(rms[i],4));
b=0;
c=0;
d=0;
a=0;
e=0;
}
//計算部分終わり
sprintf_s(str,"rms_%s%s",st9,st2);//ファイル書き込み
OUT=fopen(str,"w");
for(unsigned int j=0;j<A;j++){
fprintf(OUT,"%lf,%lf,%lf\n",rms[j],skw[j],kur[j]);
}
fclose(IN1);
fclose(IN2);
fclose(OUT);
printf("終了");
getchar();
return 0;
}