缓存到硬盘

5
我正以固定的速率接收大量数据。我需要在不同的线程上对这些数据进行处理,但是这可能比数据的到来速度慢,因此我需要缓冲数据。由于数据量很大,可用的RAM会很快耗尽,因此它需要溢出到硬盘上。我所需要的是一种类似于基于文件系统的管道的东西,使得写入者可以被文件系统阻塞,但读取者运行太慢时不能被阻塞。
下面是粗略的要求:
  • 写入不应该因为读取运行太慢而被阻塞。
  • 如果数据读取得足够慢导致可用RAM耗尽,则应将其溢出到文件系统中。写入到磁盘上是可以被阻塞的。
  • 除非写入者关闭了流,否则在没有可用数据时读取应该被阻塞。
  • 如果读取者能够跟上数据,则它永远不会击中硬盘,因为RAM缓冲区将是足够的(很好但不是必要的)。
  • 随着数据被消耗(或很快之后),应恢复磁盘空间。
这样的机制在Windows中存在吗?

尝试在没有硬盘缓存的情况下编写程序,看看它是否已经可以很好地与Windows内存管理器一起使用。 - Neil Kirk
由于我们收到的数据量太大,我们很快就会耗尽空间,这种方法行不通。而且,由于我们被困在32位机器上,我们也会用完地址空间。 - spencercw
1
尝试使用Windows文件映射。它在管理从RAM到HDD的数据交换方面非常出色,这是MSDN网站:http://msdn.microsoft.com/en-us/library/windows/desktop/aa366556%28v=vs.85%29.aspx - Flocke
文件映射的问题在于它具有固定的大小。然而,您可以通过根据需要即时创建新的文件映射来解决这个问题。您需要确保足够提前创建每个新映射以便在需要时准备好,您可能需要一个单独的线程来完成此操作。 - Harry Johnston
2个回答

1

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接