我有一个来自相机的图像流,大约100帧/秒,每张图像大约2 MB。现在只是因为磁盘写入速度,我知道我不能写每一帧,所以我只是试图每秒节省大约三分之一的帧。
流是大字符数组的循环缓冲区。现在我正在使用fwrite将每个数组转储到一个临时文件,因为它被缓冲,但它似乎只是以20-30 MB / s的速度写入,而硬盘驱动器理论上应该达到80-100 MB /小号
有什么想法?是否有比fwrite()或更优化方法更快的写入方式? 更一般地说,将大量数据转储到标准硬盘的最快方法是什么?
答案 0 :(得分:1)
如果您使用内存映射文件(例如每个1GB),该怎么办?这应该提供足够的速度和缓冲区来处理所有帧,特别是如果你设法执行零拷贝帧分配。
答案 1 :(得分:0)
fwrite
是缓冲的,这就是你想要的。虽然有大文件/写入它不应该做太多或有任何区别。也许可以通过setbuf
调用来尝试更大的流缓冲区。
由于您受到物理磁盘I / O速度的限制,只要您尽可能轻松地让系统有效地使用每个可用磁盘,您就无法做到更多。
Linux上的 vmstat
(其他系统上的其他类似工具)可以告诉你磁盘有多少磁盘i / os,所以你可以测试你的更改是否有用。
答案 2 :(得分:0)
异步非缓冲输出是您案例成功的关键。缓冲IO只会导致双缓冲开销,同步IO会使HDD磁头缺少连续扇区。
Boost.Asio为流行的平台提供了相对较好的系统特定API封装。
要记住的事情很少: