我需要编写一个使用磁盘文件的高效循环缓冲区。原因是缓冲区通常很大(> 4GB),因为此缓冲区用作PVR时移缓冲区。
更专业:
我尝试了很多实现,但找不到正常运行的东西。我总是遇到一些问题,磁盘i / o会使我的视频阅读器出现问题。
我现在要尝试使用混合解决方案,我将结合使用内存缓冲区和磁盘文件。只要数据包满(写入)或耗尽(读取)数据包,就会触发一个线程来写入/填充缓冲区。
有没有人知道该使用什么?我见过有人提到我可以使用Boost,但我无法弄清楚如何使用简单的架构来支持循环缓冲区+内存映射文件+大磁盘文件。
编辑: - 似乎我的问题不遵守规则。对此我很抱歉,我是新来的,可能错过了正确制定它的方法,以便能够妥善制定答案。 - 似乎并没有那么糟糕,因为迈克尔设法确认我需要一个混合解决方案。 - 感谢Toby提供了一个关于MythTV的提示
答案 0 :(得分:4)
实际上,您有3个独立的循环缓冲区,每个缓冲区都有自己的特性。这很好,因为复杂性可分为三个任务
输入和输出缓冲区,可以使用boost :: circular_buffer创建。增加输入缓冲区是可选的,但建议使用,因此一旦系统运行,应该最后添加这种复杂性。
可以使用缓冲或内存映射i / o实现磁盘上的循环缓冲区。 AFAIK,这必须是一个自定义类,但实现相当简单。
您还需要编写另一个自定义类,以便此系统从外部看起来像一个循环缓冲区。这个类可以有两个独立的工作线程,具有高优先级,或两个任务使用boost.asio在单个线程上运行以进行磁盘访问(这将简化锁定并避免竞争条件):
[编辑]由于大多数对磁盘缓冲区的访问是按顺序完成的,所以我更喜欢常规的缓冲I / O,操作系统磁盘缓存具有前瞻性,而且它是可移植的。此处显示的块大小应进行测试和播放,以获得最佳性能。较小的块将引入更多的OS调用,而较大的块大小将引入更多的延迟。您需要为您的应用和目标主机找到合适的余额。
答案 1 :(得分:-1)
即使你的程序只有32位(我觉得你在那里!!!)一切都没有丢失。你可以使用RAM-DISK,然后你可以寻求你的内心。