【发布时间】:2012-06-01 23:54:10
【问题描述】:
我有一个以大约 100 帧/秒的速度从相机传入的图像流,每张图像大约 2 MB。现在仅仅因为磁盘写入速度,我知道我无法写入每一帧,所以我只尝试每秒保存大约三分之一的帧。
流是大型字符数组的循环缓冲区。现在我正在使用 fwrite 将每个数组转储到一个临时文件,因为它被缓冲,但它似乎只以大约 20-30 MB/s 的速度写入,而硬盘驱动器理论上应该达到 80-100 MB/ s
有什么想法吗?有没有比 fwrite() 更快的编写方法或优化它的方法? 更一般地说,将大量数据转储到标准硬盘驱动器的最快方法是什么?
【问题讨论】:
-
在 *nix 系统上使用特定于操作系统的调用(例如
write)来获得无缓冲的调用? -
只是一个提示,但预分配文件可能会有所帮助;将几 GB 的
NUL字节写入文件(不要只是fseek()并在最后写入,那将是 sparse),因此文件系统不需要为块找到位置当您从相机接收数据时。 -
@dirkgently 除非您传递的数据块正好是扇区大小的倍数,否则使用没有缓冲的原语会不会降低效率?
-
@SJuan76:那太理想了。但是一般的
FILE/ofstream可能不会针对任何特定系统进行优化。至少,对于一个原语,OP 有一定的机会提取相当多的系统特定优势。 -
fwrite调用的第二个和第三个参数的值是多少?fwriteing 一次 1 个字节会比fwriteing 一次 64K 慢很多。另外,您是否为 每个 帧调用fopen?将所有帧写入单个文件可能会更快。
标签: c++