C 从输入文件中读取大矩阵

标签 c matrix binary fwrite fread

我试图从输入文件中读取 40000x40000 bool (二进制)矩阵并将其存储在变量中。将其存储在变量中后,我想将其写入文件。然而,按照我写的代码,需要一个多小时。有人可以帮我吗?我想我做错了什么。

代码

void get_grid_values_file(bool *grid, int n, int m, char *input_filename){
    FILE *in_file;
    in_file = fopen(input_filename, "r");  
    char buffer[1]; 
    bool search = true;
    int k=0;
    while(search){
       fseek(in_file, k, SEEK_SET);
       fread(buffer, 1, 1, in_file); 
        if(*buffer == '\n')
            search = false;
        k++;         
    }
    int i,j;    
    for(i=0; i<n; i++){
        for(j=0; j<m; j++){
           fseek(in_file, k, SEEK_SET);
           fread(buffer, 1, 1, in_file);  
           *((grid+i*m) + j) = atof(buffer);   
           k+=2;
        }
    }
    fclose(in_file);
}

void set_grid_values_file(bool *grid, int n, int m, char *output_filename){
    FILE *out_file;
    out_file = fopen(output_filename, "w"); 
    char buffer[1] = " "; 
    //Set n,m and spaces
    int length_n= (int) (log10 (abs (n))) + 1;
    char char_n[length_n];
    sprintf(char_n, "%d", n);
    fseek(out_file, 0, SEEK_SET);
    fwrite (char_n, length_n, 1, out_file);
    fseek(out_file, length_n, SEEK_SET); 
    fwrite (" ", 1, 1, out_file);      
    int length_m= (int) (log10 (abs (m))) + 1;
    char char_m[length_m];
    sprintf(char_m, "%d", m);
    fseek(out_file, length_n+1, SEEK_SET);
    fwrite (char_m, length_m, 1, out_file);
    fseek(out_file, length_n+1+length_m, SEEK_SET);
    fwrite ("\n", sizeof(char), 1, out_file);
    //Set grid
    int i,j;
    int k =length_n + length_m + 2;
    for(i=0; i<n; i++){
        for(j=0; j<m; j++){
           fseek(out_file, k, SEEK_SET);           
           buffer[0] = (*((grid+i*m) + j) == true ? '1' : '0');
           fwrite (buffer, 1, 1, out_file);    
           k++;
           fseek(out_file, k, SEEK_SET); 
           fwrite (" ", 1, 1, out_file);
           k++; 
        }
        fseek(out_file, k, SEEK_SET);
        fwrite ("\n", sizeof(char), 1, out_file);
        k++;
    }
}

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

    char *input_filename = "gen0_40kx40k.in";
    char *output_filename = "gol_output.out";
    int n = 40000;
    int m = 40000;


    bool *grid = (bool *)malloc(n*m*sizeof(bool));
    //Read
    get_grid_values_file((bool *)grid, n, m, input_filename);

    //Write
    set_grid_values_file((bool *)grid, n, m, output_filename);

    return 0;
}

输入格式,第一行包含二维矩阵的dem:
20 20
1 0 1 0 0 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0
1 1 0 0 0 0 0 1 0 1 1 1 1 0 0 1 0 0 1 1
0 1 1 0 1 0 1 1 0 0 0 1 1 0 0 1 1 0 0 1
1 0 1 1 0 1 0 0 1 0 1 1 1 0 1 0 1 1 1 1
1 1 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 1 1 1
1 1 1 0 1 0 0 0 1 0 1 0 1 0 1 1 0 1 0 1
1 1 1 0 0 0 1 1 1 0 0 1 1 1 1 1 0 0 1 1
0 1 0 1 1 1 1 1 0 1 0 1 0 1 1 1 1 0 0 1
1 0 0 0 0 1 1 0 1 1 1 1 0 1 1 1 0 0 0 0
1 1 0 0 0 1 1 0 0 1 1 1 1 1 1 1 0 1 1 0
0 1 1 0 0 0 1 1 0 1 1 0 0 1 0 1 1 1 1 1
0 0 0 1 1 1 1 1 0 0 1 0 1 1 0 0 1 1 1 0
1 0 0 1 0 0 0 1 1 1 0 1 1 0 0 0 1 1 0 0
0 1 0 1 0 1 1 0 0 0 0 1 1 0 1 1 0 1 0 1
1 0 0 0 0 0 1 1 0 1 1 0 0 0 1 1 1 1 1 1
1 1 1 0 1 0 1 1 1 1 0 0 1 0 1 1 0 0 1 0
1 0 0 1 0 0 0 1 1 1 1 0 0 0 1 1 0 0 0 1
0 0 0 1 0 1 1 1 1 0 1 0 0 0 1 1 0 0 0 1
1 1 1 0 1 0 1 1 1 0 1 1 0 1 0 1 0 1 0 1
1 1 1 0 1 0 1 1 0 1 0 0 1 0 0 0 0 1 0 1

最佳答案

从输入文件中读取更大的 block - 不是每个字符都作为单独的调用。例如,一次完成矩阵的一行。

为什么在 set_grid_values_file 的内部循环中使用两个 fwrite 调用。最好将它们结合起来:

char buffer[2] = "  ";
for(i=0; i<n; i++){
    int base = grid+i*m;
    for(j=0; j<m; j++){
        fseek(out_file, k, SEEK_SET);           
        buffer[0] = (*(base + j) ? '1' : '0');
        fwrite (buffer, 1, 2, out_file);    
        k+=2; 
     }

关于C 从输入文件中读取大矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49415616/

相关文章:

c - Variadic 函数在 Win32 中有效,但在 Win64 中无效

c - 如何使用 Visual Studio 调试 UEFI (UDK2014) Shell 应用程序

python - 构造稀疏矩阵后,从稀疏到密集再到稀疏的转换会再次降低密度

c++ - 实现复杂的基于旋转的相机

c - 使用 C 对 JSON 或任何纯文本进行二进制序列化

python - 在 Python 中用二进制表示法构建二进制数列表

c - 服务器 TCP 卡在 read() 上

c - 当给定一个指向本身是指针类型的成员的指针时,内核函数获取容器指针?

c++ - 创建对象数组的问题 C++

javascript - 语法错误: unexpected identifier - Binary algorithm code.帮助我改进它