4

I tried to create around 4 GB file using c++ fopen, fwrite and fflush and fclose functions on Linux machine, but I observed that fclose() function is taking very long time to close the file, taking around (40-50 seconds). I checked different forum to find the reason for this slowness, changed the code as suggested in forums, Used setvbuf() function to make unbuffered I/O as like write() function. but still could not resolve the issue.

        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);

Any solution to the above problem would be very helpful.

thanks, Ramesh

4

4 回答 4

5

操作系统正在推迟对磁盘的实际写入,并且可能不会在任何写入操作或什至在fflush().

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

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

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

于 2012-08-22T18:19:57.783 回答
4

将这么多数据写入磁盘需要很长时间,而且没有办法绕过这个事实。

于 2012-08-22T18:04:00.087 回答
1

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

于 2012-08-22T18:21:15.760 回答
1

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

于 2012-08-22T18:12:38.563 回答