ファイルの読み込みの件

[戻る]
南原 2005/01/21(金) 11:20:50
以下のコードのように1200000を1200000行,一列のファイルから全て読み込み、tx,tyの
配列を作りたいのですが、配列の要素数の問題があります。何か良い方法がありましたら
ご教授していただけませんか。
当方初心者です。なるべく簡単にご説明していただければうれしいです。
宜しくお願いいたします。
#include<stdio.h>
#define NUM_DATA 1200000
#define NUM_DS 1//用意するDATA列の数 
#define DATA_FILE "data.txt" 
#define NUM_A 3
#define NUM_B 1
double tx[NUM_DATA][NUM_A], ty[NUM_DATA][NUM_B];
double data2[NUM_DS][NUM_DATA];
double data[NUM_DATA*NUM_DS];
int main(){
    //FILE Pointer
    FILE *fp;
        
    if ((fp = fopen(DATA_FILE, "r")) == NULL) {
        fprintf(stderr, "ファイル[" DATA_FILE "]をオープンできませ
ん.\n");
        return 1;
    }
    
    for (int h = 0; h < NUM_DATA*NUM_DS; h++)
    {
        fscanf(fp, "%lf\n", &data[h]);
        
    printf("%lf\n ", data[h]);
    }
    
    for (int k = 0; k < NUM_DS ; k++)
    {
                    printf("%d\n ",k);
        for (int  l = 0; l < NUM_DATA; l++)
        {
            data2[k][l]=data[(k)+l*NUM_DS ];
             printf("%lf %\n", data2[k][l]);
        }            
    }
    
    

    for(int  djj=0; djj< NUM_DS ; djj++)
    {
        
        
        
        for(int nnn = 0; nnn < NUM_DATA-NUM_A; nnn++) 
        {
            for (int i = 0; i < NUM_A; i++)
            {
                tx[nnn][i]= data2[djj][nnn+i];
                    printf("tx;%lf", out2[nnn][i]);
            }
            
            for (int j = 0; j < NUM_B; j++)
            {
                ty[nnn][j]=data2[djj][nnn+i+j];
                    printf(" ty%lf\n", ty[nnn][j]);
            }
        }
printf("\n");
    }
    fclose(fp);

//ここからtx,tyを用いて計算処理をする。





    return 0;
}

επιστημη 2005/01/21(金) 11:33:42
> 配列の要素数の問題があります。

どんな問題ですか?

南原 2005/01/21(金) 11:48:04
ご返信有難うございます。
以下のようなメッセージが出ます。
トータル イメージ サイズ 831365120 が最大値 (268435456) を越えています; イメージは動作しない
可能性があります。
特に、読み込みたいデータの長さがNがSIZE_MAX / sizeof(data)の時が気になります。
また、その時のdata,data2配列のメモリの問題も気になっております。

dairygoods 2005/01/21(金) 13:00:11
> 以下のようなメッセージが出ます。

配列をヒープから確保するようにしてみてください。
(参考)
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200210/02100037.txt


> 特に、読み込みたいデータの長さがNがSIZE_MAX / sizeof(data)の時が気になります。
> また、その時のdata,data2配列のメモリの問題も気になっております。

何が気になるのか、どんな問題か、を書かないと誰にも分かりませんよ。

南原 2005/01/21(金) 14:15:09
ご返信有難うございます。


したいことは6750000点(とても大きなデータ)の全てのデータを利用して
tx, tyのような二次元配列を作ることです。
気になる点:
メモリの問題、このコードでこのような大きなデータを扱っていて問題があるかどうか、
がきになっています。
もし、このほかに有用な方法がございましたらご教授していただきたいです。
宜しくお願いいたします。

επιστημη 2005/01/21(金) 14:34:23
> このコードでこのような大きなデータを扱っていて問題があるかどうか、
> がきになっています。

どれほど大きな配列が作れるものか、実際にやってみればいい。

> このほかに有用な方法がございましたらご教授していただきたいです。

'なにをどうする'有用な方法が知りたいのですか?
巨大配列を作る方法?
巨大配列のように見せかける方法?
巨大配列なしに済ます方法?
ほかのなにか? さっぱりわからん。

南原 2005/01/21(金) 15:44:59
返信有難うございます。
分かりにくくて申し訳ございません。

うまく表現できないかも知れませんが、頑張りますのでもう少しだけお付き合いくださ
い。

@上述したコードを利用して6750000点(とても大きなデータ)のデータを読み込む。
A読み込んだ全てのデータを利用してtx, tyのような二次元配列を作る。
Btx,tyの値を少しずつ利用して適当な処理を施す。

printf("%lf\n ", data[h]);
                 int c=0;
        for(int count = 0; nnn < 10000; count++) 
        {
            c=c+100;            
            for (int j = c; j < c+100; j++)
            {
                tx[nnn][j];//これを利用して処理を施す。
            }
        }
                  int c=0;
        for(int count = 0; nnn < 10000; count++) 
        {
            c=c+100;            
            for (int j = c; j < c+100; j++)
            {
                ty[nnn][j];//これを利用して処理を施す。
            }
        }
そのようなことがやりたいです。しかしながら現在、6750000点全てを読み込むことが出
来ません。printf("%lf\n ", data[h]);で確認してみますと、途中から0出力になってし
まいます。このような方法以外に@からBの処理をするときにいい方法がございましたら
ご教授いただきたいです。
宜しくお願いいたします。

επιστημη 2005/01/21(金) 15:54:10
データすべてを配列、すなわちメモリ内に取り込むことができないのなら、
ファイル内に置いたまま使う(必要になるたびに読み出す)というのも一つの方法です。
処理速度はガタ落ちですけど。

作りたがり屋 2005/01/21(金) 16:17:57
ども。作りたがり屋と申します。
こんにちは「南原」さん。
えっと、南原さんがどのような処理をしたいのか
わからないんですけど、変数名とかからして
2次元座標系に関わるものっぽいですねぇ…
これって本当にdouble tx[NUM_DATA][NUM_A]じゃないとマズイんですか?
もし2次元座標系の話なら、どうせintとかにキャストするなりして
使うんでしょ?これがintで済むならサイズは半分ですよね?
半分でもまだオーバーするならshortにすればなんとサイズは4分の1。
でもきっと、これじゃマズイ…ですよねぇ…_| ̄|○

dairygoods 2005/01/21(金) 16:36:09
6750000(点) x 8(sizeof(double)) x 2(次元) = 108000000 byte ≒ 103 mbyte

一度に確保できない量でもないと思います。
提示したリンク先の方法は試されたのでしょうか?

古いスレッドには追加発言できません。