将数据流写入磁盘的最快方法

时间:2012-05-27 00:01:37

标签: c++

我有一个来自相机的图像流,大约100帧/秒,每张图像大约2 MB。现在只是因为磁盘写入速度,我知道我不能写每一帧,所以我只是试图每秒节省大约三分之一的帧。

流是大字符数组的循环缓冲区。现在我正在使用fwrite将每个数组转储到一个临时文件,因为它被缓冲,但它似乎只是以20-30 MB / s的速度写入,而硬盘驱动器理论上应该达到80-100 MB /小号

有什么想法?是否有比fwrite()或更优化方法更快的写入方式? 更一般地说,将大量数据转储到标准硬盘的最快方法是什么?

3 个答案:

答案 0 :(得分:1)

如果您使用内存映射文件(例如每个1GB),该怎么办?这应该提供足够的速度和缓冲区来处理所有帧,特别是如果你设法执行零拷贝帧分配。

答案 1 :(得分:0)

fwrite是缓冲的,这就是你想要的。虽然有大文件/写入它不应该做太多或有任何区别。也许可以通过setbuf调用来尝试更大的流缓冲区。

由于您受到物理磁盘I / O速度的限制,只要您尽可能轻松地让系统有效地使用每个可用磁盘,您就无法做到更多。

Linux上的

vmstat(其他系统上的其他类似工具)可以告诉你磁盘有多少磁盘i / os,所以你可以测试你的更改是否有用。

答案 2 :(得分:0)

异步非缓冲输出是您案例成功的关键。缓冲IO只会导致双缓冲开销,同步IO会使HDD磁头缺少连续扇区。

Boost.Asio为流行的平台提供了相对较好的系统特定API封装。

要记住的事情很少:

  • 在大多数非Windows平台上,您必须写入原始分区,以获取系统的缓冲区和内部线程。
  • 始终保持写入队列非空,因此SATA控制器可以通过NCQ帮助您。
  • 注意系统特定的要求,以缓冲对齐和大小,以使异步非缓冲IO工作。
  • 文件打开模式对于使系统完成您想要的操作也很重要。