C++ C++;:IO性能问题

C++ C++;:IO性能问题,c++,C++,我的内存中有一个大数组。我在文件中使用以下方法编写此文件: FILE* fp = fopen("filename", "wb"); fwrite(array, sizeof(uint32_t), 1500000000 , fp); // array saved fflush(fp) ; fclose(fp); 并使用以下方法再次阅读: FILE* fp = fop

我的内存中有一个大数组。我在文件中使用以下方法编写此文件:

             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秒

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

#包括
#包括
#包括
#包括
#包括
使用名称空间std;
main()
{
uint32_t*ele=新uint32_t[100];
对于(int i=0;i<100;i++)
ele[i]=i;
对于(int i=0;i<100;i++){
if(ele[i]<20)
继续;
其他的
//将ele[i]写入文件
;   
}
对于(int i=0;i<100;i++){
if(ele[i]<20)
继续;
其他的
//从文件中读取数字
//ele[i]=编号*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);
}
for(int i=0;i<150000000;i++){
if(数组[i]<10000000)
继续;
uint32_t编号=阵列[i];
写入(和编号,尺寸(uint32_t),1,fp1);
}
并使用:
fread(&number,sizeof(uint32_t),1,fp1)进行读取

这种情况:书写需要2.13分钟,阅读需要1.05分钟


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

只写一次会快得多。我建议您仅使用要打印的元素构造一个辅助数组,并在一个fwrite调用中写入该数组。当然,这需要额外的内存,但这是标准的折衷办法——内存换取性能。

只写一次会快得多。我建议您仅使用要打印的元素构造一个辅助数组,并在一个fwrite调用中写入该数组。当然,这将需要额外的内存,但这是标准的折衷-内存对性能。

即使C的FILE*例程被缓冲,每次调用仍然会有相当大的开销-最终执行数百万个整数大小的读/写操作将降低性能

编辑:您是否正在尝试进行整数大小的读取以优化速度?或者,您这样做是出于某些数据一致性原因(即,如果条件为真,则数组中的整数必须仅更新)


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

,即使C的文件*例程是缓冲的,每次调用仍然会有相当大的开销-最终执行数百万个整数大小的读/写操作会降低性能

编辑:您是否正在尝试进行整数大小的读取以优化速度?或者,您这样做是出于某些数据一致性原因(即,如果条件为真,则数组中的整数必须仅更新)

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

i,在我的框中,很多小代码> fWreWe()/代码>调用只能维持大约90 Mb/s。(磁盘速度比这快得多,因此测试没有磁盘绑定)

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

I写出整个数组,在我的框中,许多小的
fwrite()
调用只能维持大约90MB/s(磁盘速度比这个快得多,因此测试没有磁盘限制)


我的建议是做自己的缓冲:将值写入中间数组,并不时地使用单个<代码> fWreWe()/<代码>写出整个数组。

< P>标题的标题是C++,为什么不使用优秀的缓冲流设施呢?
问题的标题是C++,为什么不使用优秀的缓冲流设施呢?

可能是复制粘贴问题-读取文件时,您应该使用
rb
打开该文件。您能否生成一个最小但自包含的测试用例来演示该问题。这将使我们能够对您的确切代码进行实验,而不是进行二次猜测。@IvayloStrandjev,对不起。我是在rb模式下打开的。但是,在上面的代码中,我只做了mi赌注。您是否尝试过使用中间数组存储所有有效值,然后在一次操作中将该数组写入文件?@alessandro,您需要更好地描述您的场景。是否需要线性读取整个文件?是否需要将其全部保存在内存中,或者是否可以执行读取-处理-写入操作?为什么是条件读取/写入完成?-很难从原始问题中给出很多有意义的建议。可能是复制粘贴问题-在阅读文件时,您应该使用
rb
打开该文件。您能否生成一个最小但自包含的测试用例来演示该问题。这将使我们能够对您的确切代码进行实验,而不是进行二次猜测。@IvayloStrandjev,对不起。我是在rb模式下打开的。但是,在上面的代码中,我犯了一个错误。您是否尝试过使用中间数组存储所有有效值,然后在一次操作中将该数组写入文件?@alessandro,您需要更好地描述您的场景。您需要线性读取整个文件吗?您需要保留吗这一切都在内存中,或者你能做读-写过程吗?为什么要做有条件的读/写?-很难从你最初的问题中给出很多有意义的建议。这对我来说是不可能的。我的内存非常有限。任何可能的写和快速读的方法。主要关注的是阅读。我会给你建议,至少比
for(int i = 0; i < 1500000000 ; i++ ){
if (arrays[i] < 10000000)
continue ;
uint32_t number = arrays[i] ;
fwrite(&number, sizeof(uint32_t), 1, fp1);
}