【发布时间】:2018-05-24 09:42:48
【问题描述】:
我需要保存视频系统的痕迹,以便以后在 Windows 机器上进行检查重播。
帧生成是在线程中完成的,我想在处理函数结束时保存帧,例如
void generate_video_frame() {
....
save_frame(frame);
}
为避免减慢生成线程save_frame 必须尽快完成此操作。最终目标是对视频进行磁盘保存跟踪。
每个帧都可能很大(甚至 20-30 MB),所以我不能将所有内容都存储在 RAM 中,因为我最终会完全填满它。
我想到了两个解决方案:
填充帧队列并使用另一个线程将其清空并将其刷新到磁盘(因此主线程不会受到影响)。如果刷新到磁盘线程较慢(如我所料),这最终也可能会填满 RAM
使用mapped file 并尽快写入每一帧
有没有更好的方法?如果没有,我应该注意哪些缺点/注意事项?
【问题讨论】:
-
异步写入文件
-
@RbMm 异步写入文件其中一个问题是错误处理 - 当有 50 个等待异步写入的待处理 IO 请求排队时,您如何干净地处理 IO 错误?另一个是管理在异步写入完成之前可能必须保持不变的数据缓冲区。正如 OP 所建议的那样,将框架对象放入写入线程的队列中可能要容易得多。
-
每个帧都可以很大(甚至 20-30 MB),所以我不能将所有内容都存储在 RAM 中,因为我最终会完全填满它。队列大小 - 一旦队列达到一定大小,让生产者线程阻塞,直到尝试添加到队列时队列大小下降。是的,它会减慢帧的生成速度,但最终您的帧生成速率受限于您写入磁盘的速度。
-
@AndrewHenle - 当然是处理。有多少待处理的 io 请求在这里根本不起作用
-
@RbMm 有多少挂起的io请求在这里根本不起作用 当然挂起的IO请求的数量起了作用。在异步写入完成之前,保存要写入的数据的内存缓冲区不能用于其他目的。缓冲区需要保留和跟踪,并且 OP 已经声明内存使用是一个考虑因素。
标签: c++ windows multithreading performance serialization