3

長い間Cを使用していませんが、CSVから2D配列を埋めるのに問題があります。ファイル形式は次のようになります。

ノード、イン、アウト

1,200,10393

..。

これは基本的に、リンクリストの配列表現です。150000個の要素があり、配列を埋めようとすると、「main.exeの0x000000013facb957で未処理の例外:0xC00000FD:スタックオーバーフロー」というエラーが発生します。私は16GBのRAMを搭載した64ビットマシンを使用しており、x64ビルド構成でVS C ++2010Expressを使用しています。

int main(int argc, char *argv[])
{

int counter = 0;
char line [ 1024 ];
int map[150000][2] = {0};
char *comma = ",";
char *token;
int index;
int in, out;
char* end;
int nodeID;
FILE *fp;

fp = fopen("mapsorted.txt","r"); // read mode

if( fp == NULL )
{
  perror("Error while opening the file.\n");
  exit(EXIT_FAILURE);
}

//Skip header line
fgets ( line, sizeof line, fp );

while ( fgets ( line, sizeof line, fp ) != NULL) /* read a line */
{
    //first part - the index for storage
    token = strtok(line,comma);
    index = strtol(token,&end,10);

    //second part
    token = strtok(NULL,comma);
    in = atoi(token);

    //third part
    token = strtok(NULL,comma);
    out = atoi(token);

    //store in array
    map[index][0] = in;
    map[index][1] = out;
}
fclose ( fp );
}

小さい配列を割り当てるとコードは機能するように見えますが、これほど大きい場合は失敗します。このサイズの配列を処理するのに十分なメモリが必要だと思います。

4

2 に答える 2

7
int map[150000][2];

少なくとも2*4 * 150000バイト(最新の32ビットアーキテクチャを想定)のようです。これは約1.2MBです。最近のOSは通常、数メガバイトのスタックサイズを設定していることを知っているので、これは実際には問題になる可能性があります。数ギガバイトのRAMを搭載したコンピューターは、特にスタック上ではなく、プロセスによってすべてが消費される可能性があることを意味するわけではありません。大きな配列の場合malloc()は、ヒープ上のメモリをいくらか食べてみてください。

int (*map)[2] = malloc(sizeof(*map) * 150000);

また

int *map = malloc(150000 * 2 * sizeof(*map));

(2番目の場合の寸法に注意してください!)、またはstaticスタックスペースから移動するように宣言します。

static int map[150000][2];

または、同様の動作を実現するために、単にグローバル変数にします。

int map[150000][2];

void foo()
{
    ...
}
于 2012-12-30T18:29:04.950 に答える
2

配列が大きすぎてスタックに収まりません。関数の外に移動してみてください。

static int map[150000][2] = {0};
int main(int argc, char *argv[])
{

等々。

于 2012-12-30T18:28:08.160 に答える