c ++使用大磁盘文件的循环缓冲区

时间:2017-08-24 19:48:36

标签: c++

我需要编写一个使用磁盘文件的高效循环缓冲区。原因是缓冲区通常很大(> 4GB),因为此缓冲区用作PVR时移缓冲区。

更专业:

  • 此缓冲区存储传输流(TS)文件,该文件由188字节(TS数据包)
  • 的数据包组成
  • 有一位作家和一两位读者。读者必须能够进入文件(如果我们想快进或回到过去,就会发生这种情况)
  • 托管此实现的进程仅为32位。

我尝试了很多实现,但找不到正常运行的东西。我总是遇到一些问题,磁盘i / o会使我的视频阅读器出现问题。

我现在要尝试使用混合解决方案,我将结合使用内存缓冲区和磁盘文件。只要数据包满(写入)或耗尽(读取)数据包,就会触发一个线程来写入/填充缓冲区。

有没有人知道该使用什么?我见过有人提到我可以使用Boost,但我无法弄清楚如何使用简单的架构来支持循环缓冲区+内存映射文件+大磁盘文件。

编辑: - 似乎我的问题不遵守规则。对此我很抱歉,我是新来的,可能错过了正确制定它的方法,以便能够妥善制定答案。 - 似乎并没有那么糟糕,因为迈克尔设法确认我需要一个混合解决方案。 - 感谢Toby提供了一个关于MythTV的提示

2 个答案:

答案 0 :(得分:4)

实际上,您有3个独立的循环缓冲区,每个缓冲区都有自己的特性。这很好,因为复杂性可分为三个任务

  • 1 输入缓冲区,用于传入视频
    • 存储单元:188字节TS包。
    • 视频流输入。
    • 输出到主盘上循环缓冲区。
    • 可选地,此缓冲区可以在限制范围内增长,以适应机器负载。
  • 1个 on-disk 缓冲区。
    • 存储单元:4096字节,或21 x 188字节TS数据包(148字节标头+ 3948字节有效负载),您还可以使用4096的另一倍数作为项目大小。使用4096的倍数可以大大提高磁盘i / o响应。
    • 这是一个固定大小的文件。
    • 从输入缓冲区输入
    • 输出到输出缓冲区。
    • 指向此缓冲区(head,tail)的指针可以保存在内存中。
  • 1 输出缓冲区
    • 存储单元:188字节TS包。
    • 主要是为了观察口吃。
    • 固定大小

输入和输出缓冲区,可以使用boost :: circular_buffer创建。增加输入缓冲区是可选的,但建议使用,因此一旦系统运行,应该最后添加这种复杂性。

可以使用缓冲或内存映射i / o实现磁盘上的循环缓冲区。 AFAIK,这必须是一个自定义类,但实现相当简单。

您还需要编写另一个自定义类,以便此系统从外部看起来像一个循环缓冲区。这个类可以有两个独立的工作线程,具有高优先级,或两个任务使用boost.asio在单个线程上运行以进行磁盘访问(这将简化锁定并避免竞争条件):

  • 第一项任务是将多余的输入缓冲区卸载到磁盘缓冲区。
  • 第二项任务是收费以保持输出缓冲区满负荷。

[编辑]由于大多数对磁盘缓冲区的访问是按顺序完成的,所以我更喜欢常规的缓冲I / O,操作系统磁盘缓存具有前瞻性,而且它是可移植的。此处显示的块大小应进行测试和播放,以获得最佳性能。较小的块将引入更多的OS调用,而较大的块大小将引入更多的延迟。您需要为您的应用和目标主机找到合适的余额。

答案 1 :(得分:-1)

即使你的程序只有32位(我觉得你在那里!!!)一切都没有丢失。你可以使用RAM-DISK,然后你可以寻求你的内心。

示例Gavotte Ramdisk Utility