我有一个程序,可以使用fwrite
保存许多大于1GB的大文件。它可以正常工作,但是不幸的是,由于数据的性质,每次调用fwrite
只能写入1-4个字节。结果是写可能要花一个多小时,大部分时间似乎是由于syscall开销(或至少在fwrite的库函数中)。我对fread
有类似的问题。
有谁知道任何现有的/库函数将使用内联函数来缓冲这些写入和读取,还是您自己准备了另一卷?
最佳答案
首先,fwrite()
是一个库,而不是系统调用。其次,它已经缓冲了数据。
您可能想尝试增加缓冲区的大小。这是通过使用 setvbuf()
完成的。在我的系统上,这仅能提供一点帮助,但对YMMV却有帮助。
如果setvbuf()
没有帮助,则可以进行自己的缓冲,仅在累积足够的数据后才调用fwrite()
。这涉及更多的工作,但几乎可以肯定会加快编写速度,因为可以使自己的缓冲比fwrite()
轻得多。
编辑:如果有人告诉您问题在于fwrite()
调用的绝对数量,请要求查看证据。更好的是,进行自己的性能测试。在我的计算机上,使用fwrite()
进行的500,000,000个两个字节的写入需要11秒。这相当于约90MB/s的吞吐量。
最后但并非最不重要的一点是,我的测试中的11秒与您的问题中提到的1小时之间的巨大差异暗示着您的代码中可能还会发生其他事情,从而导致性能很差。
关于c++ - fwrite对大量小写操作的效率,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13588245/