1

我在内存中有一个大数组。我正在使用以下文件将其写入文件:

             FILE* fp = fopen("filename", "wb");
             fwrite(array, sizeof(uint32_t), 1500000000 , fp); // array saved
             fflush(fp) ;
             fclose(fp);

并使用以下方法再次阅读:

              FILE* fp = fopen("filename", "rb");
              fread(array, sizeof(uint32_t), 1500000000 , fp);
              fclose(fp);

因为,写需要 7 秒,读需要 5 秒。

实际上,我不必编写整个数组。我必须通过检查一些条件来编写和阅读它。像(示例案例):

#include<iostream>
#include <stdint.h>
#include <cstdio>
#include <cstdlib>
#include <sstream>

using namespace std;

main()
{
      uint32_t* ele = new uint32_t [100] ;
      for(int i = 0; i < 100 ; i++ )
      ele[i] = i ;

      for(int i = 0; i < 100 ; i++ ){
          if(ele[i] < 20)
          continue ;
          else
          // write  ele[i] to file
          ;   
      }

 for(int i = 0; i < 100 ; i++ ){
          if(ele[i] < 20)
          continue ;
          else
          // read  number from file
          // ele[i] = number * 10 ;
          ;   
      }

     std::cin.get();
}

出于这个原因,我正在做的是:

写作使用:

for(int i = 0; i < 1500000000 ; i++ ){
if (arrays[i] < 10000000)
continue ;
uint32_t number = arrays[i] ;
fwrite(&number, sizeof(uint32_t), 1, fp1);
}

并阅读使用:fread(&number, sizeof(uint32_t), 1, fp1);

本例:写入需要 2.13 分钟,读取需要 1.05 分钟。

这对我来说是相当长的时间。谁能帮助我,为什么会发生这种情况(在第二种情况下文件大小小于第一种)?以及如何解决这个问题?还有其他更好的方法吗?

4

4 回答 4

2

不久前对此进行了基准测试,在我的机器上,许多小型fwrite()调用只能维持大约 90 MB/s(磁盘比这快得多,因此测试不受磁盘限制)。

我的建议是自己做缓冲:将值写入中间数组,并不时使用单个fwrite().

于 2013-01-24T10:30:50.320 回答
1

只写一次会更快。我建议您仅使用要打印的元素构建一个辅助数组,然后在单个 fwrite 调用中写入该数组。当然,这将需要额外的内存,但这是标准的权衡 - 内存与性能。

于 2013-01-24T10:22:23.923 回答
1

即使 C 的 FILE* 例程被缓冲,每次调用仍然有相当多的开销 - 最终执行数百万次整数大小的读/写会影响您的性能。

编辑:您是否正在尝试进行整数大小的读取以优化速度?还是出于某些数据一致性的原因(即,只有在条件为真时才必须更新数组中的整数)?

如果出于一致性原因,请考虑一次读取一个块(可能是 4k 或更大),然后从数据块中进行比较并可能更新 - 或使用内存映射文件,如果它在您的目标平台上可用( s)。

于 2013-01-24T10:28:05.417 回答
0

问题的标题是 C++,那么为什么不使用出色的缓冲流设施呢? C++ ofstream 文件写入是否使用缓冲区?

于 2013-01-24T10:49:42.883 回答