我尝试在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);
上述问题的任何解决方案都会非常有用。
感谢, 拉梅什
答案 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(),或类似的东西。