fclose()函数慢

时间:2012-08-22 18:00:53

标签: c++

我尝试在Linux机器上使用c ++ fopen,fwrite和fflush以及fclose函数创建大约4 GB的文件,但我发现fclose()函数需要很长时间才能关闭文件,大约需要40-50秒)。我检查了不同的论坛,找到了这种缓慢的原因,改变了论坛中建议的代码,使用setvbuf()函数使得无缓冲的I / O像write()函数一样。但仍然无法解决问题。

        totalBytes = 4294967296 // 4GB file
        buffersize = 2000;    
        while ( size <= totalBytes )
        {
            len = fwrite(buffer, 1, bufferSize, fp);
            if ( len != bufferSize ) {
                cout<<"ERROR (Internal): in calling ACE_OS::fwrite() "<<endl;
                ret = -1;
            }
            size = size + len;
        }
        ...
        ...
        ...
        fflush(fp);
        flcose(fp);

上述问题的任何解决方案都会非常有用。

感谢, 拉梅什

4 个答案:

答案 0 :(得分:4)

将大量数据写入磁盘需要很长时间,并且无法解决这个问题。

答案 1 :(得分:4)

操作系统正在推迟对磁盘的实际写入,并且可能无法在任何写入操作或甚至fflush()处将数据实际写入磁盘。

我查看了fflush()的手册页,并看到了以下注释:

  

请注意,fflush()仅刷新由提供的用户空间缓冲区   C库。确保数据物理存储在磁盘上   必须刷新内核缓冲区,例如,使用sync(2)或   FSYNC(2)。

(对于fclose()也有类似的注释,尽管Linux系统上的行为似乎有所不同)

答案 2 :(得分:1)

fopen / fwrite / fclose是低级别开放/写入/关闭的C标准包装器。所有fflush正在做的是确保所有'写'调用都是为缓冲的东西做的。 fflush没有“同步点”。操作系统在允许“关闭”返回之前刷新写缓冲区。

答案 3 :(得分:1)

是的,fclose()所花费的时间是操作系统将数据写入磁盘所花费的时间的一部分。
看看fsync用fflush实现你想要的东西。如果你想显示一些进度,并且fclose()使用的时间使得它不准确,你可以每写入100 MB写一个fsync(),或类似的东西。