【问题标题】:Buffering to the hard disk缓冲到硬盘
【发布时间】:2014-11-20 13:21:40
【问题描述】:

我正在以固定速率接收大量数据。我需要在不同的线程上对这些数据进行一些处理,但这可能比传入的数据运行得慢,所以我需要缓冲数据。由于可用 RAM 中的数据量很快就会耗尽,因此需要溢出到硬盘上。我可以使用类似文件系统支持的管道,因此写入器可能会被文件系统阻塞,但不会被运行速度太慢的读取器阻塞。

这是一组粗略的要求:

  • 不应因阅读器运行速度过慢而阻塞写入。
  • 如果数据读取速度太慢以至于可用 RAM 耗尽,它应该溢出到文件系统。对磁盘的写入被阻止是可以的。
  • 如果没有可用数据,则读取应该阻塞,除非流已被写入器关闭。
  • 如果阅读器能够跟上数据,那么它永远不会撞到硬盘,因为 RAM 缓冲区就足够了(很好但不是必需的)。
  • 应在数据被消耗时(或不久之后)恢复磁盘空间。

Windows 中是否存在这种机制?

【问题讨论】:

  • 尝试在没有高清缓冲的情况下编写程序,看看它是否已经在 Windows 内存管理器中运行良好。
  • 随着我们接收到的数据量,我们将很快耗尽空间而无法正常工作。由于我们被困在 32 位机器上,我们还将耗尽地址空间..
  • 尝试 Windows 文件映射。它非常擅长管理从 ram 到 hdd 的数据交换,这里是 msdn 站点:msdn.microsoft.com/en-us/library/windows/desktop/…
  • 文件映射的问题在于它的大小是固定的。但是,您可以根据需要即时创建新的文件映射来解决此问题。您需要确保提前足够远地创建每个新映射,以便在需要时为您准备好,您可能需要一个单独的线程。

标签: c++ windows buffer pipe


【解决方案1】:

这看起来像一个经典的消息队列。您是否考虑过 MSMQ 或类似的? MSMQ 具有您要求的所有属性。您可能希望使用直接寻址来避免 Active Directory http://msdn.microsoft.com/en-us/library/ms700996(v=vs.85).aspx 并使用本地或 TCP/IP 队列地址。

【讨论】:

    【解决方案2】:

    使用实际文件。在接收到数据时写入文件,并在另一个进程中从文件中读取数据并进行处理。

    您甚至可以获得不使用多线程的额外好处。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-27
      • 2013-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多