C++ 在不降低线程速度的情况下保存大量数据
我需要保存一个视频系统的跟踪,以便以后在Windows机器上进行检查回放 帧生成是在线程中完成的,我想在处理函数的末尾保存帧,例如C++ 在不降低线程速度的情况下保存大量数据,c++,windows,multithreading,performance,serialization,C++,Windows,Multithreading,Performance,Serialization,我需要保存一个视频系统的跟踪,以便以后在Windows机器上进行检查回放 帧生成是在线程中完成的,我想在处理函数的末尾保存帧,例如 void generate_video_frame() { .... save_frame(frame); } 为避免降低生成线程的速度,save_frame必须尽快完成此操作。最终目标是将视频的轨迹保存到磁盘上 每个帧可以相当大(甚至20-30MB),所以我不能将所有内容都存储在RAM中,因为我最终会将其完全填满 我想到了两种解决方案: 填
void generate_video_frame() {
....
save_frame(frame);
}
为避免降低生成线程的速度,save_frame
必须尽快完成此操作。最终目标是将视频的轨迹保存到磁盘上
每个帧可以相当大(甚至20-30MB),所以我不能将所有内容都存储在RAM中,因为我最终会将其完全填满
我想到了两种解决方案:
- 填充一个帧队列并使用另一个线程清空它并将其刷新到磁盘(这样主线程就不会受到影响)。如果刷新到磁盘线程速度较慢(如我所料),这可能最终会填满RAM
- 使用a,尽可能快地写下每一帧
有更好的方法吗?如果没有,我应该注意哪些缺点/注意事项?这取决于具体情况。你的镜框的来源是什么?它们是否来自实时来源,即摄像头,然后以某种方式进行处理?或者它们仅仅是由任何类型的数据生成的(并且没有来自数据源的实时压力) 你的问题似乎暗示了后者。如果是这种情况,我建议确实在不同的线程中运行创建和写入磁盘。事实上,可能还有更多,你可能不仅有两项任务,还有三项:
这里有很多可以优化的螺钉。您的目标似乎是尽可能快地拥有整个系统。问题通常是什么时候投入工作来实现这一目标。如果你正在开发的东西都是有效的,而且只是为了性能,你可能会去做。如果你只是关心这件事,但你最终想做的事情还没有完成,我总是建议先运行,然后再快速运行。写入文件asynchronous@RbMm写入文件异步一个问题是错误处理——当有50个等待异步写入的IO请求排队时,如何干净地处理IO错误?另一种方法是管理数据缓冲区,在异步写入完成之前,这些缓冲区可能必须保持不变。正如OP所建议的,将帧对象放入写入线程队列可能会容易得多。每个帧都可能相当大(甚至20-30MB),因此我不能将所有内容都存储在RAM中,因为我最终会将其完全填满。限制队列大小-一旦队列达到某个大小,让生产者线程阻塞,直到尝试添加到队列时队列大小下降。是的,它会减慢帧生成速度,但最终帧生成速度受限于您写入磁盘的速度。@AndrewHenle-当然可以。有多少未决io请求在此处不起作用all@RbMm存在多少未决io请求根本不起作用,当然未决io请求的数量起作用。在异步写入完成之前,保存要写入的数据的内存缓冲区不能再用于其他目的。缓冲区需要保留和跟踪,OP已经声明内存使用是一个考虑因素。