【问题标题】:How to read a big data in C? [duplicate]如何在 C 中读取大数据? [复制]
【发布时间】:2022-01-03 05:33:50
【问题描述】:

我练习 C 中的文件处理。我需要读取一个记录了大约 9000000 个数据的文件。 它在我读取前 9000 个数据时起作用。但是,当我设置 NUM_DATA = 9000000 时,它总是崩溃。 我该如何解决这个问题?

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>

#define MAX_LENGTH 10
#define NUM_DATA 9000000

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

    char **signal = malloc( NUM_DATA * MAX_LENGTH * sizeof(char *) );
    char **svid = malloc( NUM_DATA * MAX_LENGTH * sizeof(char *) );

    char GetString[110];
    int num;
    double tw[NUM_DATA], ip[NUM_DATA], qp[NUM_DATA]
    char a[20], b[20], c[20], d[20], e[20], f[20], g[20], h[20], z[20], x[20], w[20];

    FILE *fIn;

    fIn = fopen(argv[1], "r");

    // read header
    fgets(GetString, 109, fIn);
    fgets(GetString, 109, fIn);

    // read data
    num = 0;
    while (!feof(fIn)){

        fscanf(fIn, "%[^','],%[^','],%[^','],%[^','],%[^','],%[^','],%[^','],%[^','],%[^','],%[^','],%f",
               a, b, c, d, e, f, g, h, z, x, w);

        tw[num] = atof(a);
        ip[num] = atof(z);
        qp[num] = atof(x);
        signal[num] = malloc(MAX_LENGTH * sizeof(char *));
        strcpy(signal[num], f);
        strcpy(svid[num], h);
        num++;
    }
    fclose(fIn);
}

文件格式:

353700.000,1352,0.020000,0.000000,1,ISR1,Main,E11,173,14,56.102000 353700.000,1353,0.020000,0.000000,1,ISR1,Main,E11,156,7,14.367000 353700.000,1354,0.020000,0.000000,1,ISR1,Main,E11,161,14,40.136000 353700.000,1355,0.020000,0.000000,1,ISR1,Main,E11,316,23,31.326000 353700.000,1356,0.020000,0.000000,1,ISR1,Main,E11,152,-1,3.806000 353700.000,1357,0.020000,0.000000,2,ISR1,Main,G14,-101,10,51.833000 353700.000,1358,0.020000,0.000000,3,ISR1,Main,G24,434,-3,56.414000 353700.000,1359,0.020000,0.000000,3,ISR1,Main,G24,171,-4,17.890000 353700.000,1360,0.020000,0.000000,3,ISR1,Main,G24,474,6,52.542000

......

【问题讨论】:

  • 是否需要将所有数据同时保存在内存中,还是可以分块聚合数据?
  • 它崩溃了,因为你在堆栈上分配了你的数组。容量有限。您最好使用动态分配(malloc/free 和朋友)。当然,这也可能失败,但以更可控的方式。
  • 你打算对这些数据进行什么样的操作?
  • @Matthew 是的,我需要对所有数据进行一些分析。

标签: c


【解决方案1】:

您正在使用该大小的本地数组溢出堆栈。而是动态分配它们。

double *tw = malloc(NUM_DATA * sizeof(double));
double *ip = malloc(NUM_DATA * sizeof(double));
double *qp = malloc(NUM_DATA * sizeof(double));

【讨论】:

  • 感谢您的回答。我已经在动态分配中分配了三个变量和 svid[num] ,它可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-29
  • 2019-06-21
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多