【发布时间】:2012-09-25 21:08:21
【问题描述】:
我在 VC++ 下使用 OpenCV 2.2 编写应用程序。我从不同的网络流中获取视频,并在单独的线程中逐帧写入 AVI 文件。视频流有数百个,我的应用程序将数百个文件写入磁盘非常重,有人可以告诉我优化的方法
提前致谢
【问题讨论】:
标签: multithreading visual-c++ avi
我在 VC++ 下使用 OpenCV 2.2 编写应用程序。我从不同的网络流中获取视频,并在单独的线程中逐帧写入 AVI 文件。视频流有数百个,我的应用程序将数百个文件写入磁盘非常重,有人可以告诉我优化的方法
提前致谢
【问题讨论】:
标签: multithreading visual-c++ avi
哦,亲爱的。我希望你有足够的内存。
编写多个文件真的很痛苦。您可以做的最好的事情是通过始终尽可能合理地写入尽可能大的 AVI 帧(最好是扇区大小的倍数)来减轻写入搜索。也许:
1) 一个“FrameBuf”帧缓冲类。在启动时创建一个 *FrameBuf 的垃圾并将它们汇集到生产者-消费者队列中。
2) 用于多个 *FrameBuf 实例的“FrameVec”容器类。您可能还需要合并这些。
3) 用于将 *FrameVec 的内容写入磁盘系统的线程池。这将包含很少的线程,可能只有一个,以获得最佳的磁盘写入性能和很少的寻道。最好使线程数在运行时可配置/可更改,以优化整体吞吐量。最好让它全部可配置 - *FrameBuf 池的深度,每个 *FrameVec 中 *FrameBuf 的数量 - 一切。
如果可能,请使用 SSD。如果系统有任何“安静”时间,它可以将累积的 avi 移动到一个大的旋转器或网络磁盘,以便为下一个“忙碌”时间释放 SSD。
在移动各种实例时,请记住以下咒语:
'Stack-objects, copy ctors, any template class with no * bad', and 'pointers, pools, pointer containers good'.
祝你好运..
【讨论】: