3

我有一个以大约 100 帧/秒的速度从相机传入的图像流,每个图像大约 2 MB。现在仅仅因为磁盘写入速度,我知道我无法写入每一帧,所以我只尝试每秒保存大约三分之一的帧。

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

有什么想法吗?有没有比 fwrite() 更快的编写方法或优化它的方法?更一般地说,将大量数据转储到标准硬盘驱动器的最快方法是什么?

4

3 回答 3

1

如果您将使用限制为例如每个 1GB 的内存映射文件怎么办?这应该提供足够的速度和缓冲区来处理所有帧,尤其是在您设法执行零拷贝帧分配的情况下。

于 2012-05-27T01:31:02.970 回答
0

fwrite被缓冲,这就是你想要的。尽管有了这么大的文件/写入,它不应该有太大或任何区别。也许在调用时尝试使用更大的流缓冲区setbuf

由于您受到物理磁盘 i/o 速度的限制,只要您尽可能简单地让系统有效地使用每个可用的磁盘 io,您就无能为力了。

vmstat在 linux 上(其他系统上的其他类似工具)可以告诉您磁盘正在执行多少磁盘 i/os,因此您可以测试您的更改是否有帮助。

于 2012-05-27T00:17:11.350 回答
0

在您的案例中,异步非缓冲输出是成功的关键。缓冲 IO 只会导致双缓冲开销,而同步 IO 会使 HDD 磁头丢失顺序扇区。

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

有几件事要记住:

  • 在大多数非 Windows 平台上,您将不得不写入原始分区以获取系统的缓冲和内部线程。
  • 始终保持写入队列非空,因此 SATA 控制器可以通过 NCQ 帮助您。
  • 注意系统特定的缓冲区对齐和大小要求,以使异步非缓冲 IO 正常工作。
  • 文件打开模式对于使系统做你想做的事情也很重要。
于 2012-05-27T04:25:45.490 回答