【问题标题】:c++ heavy data processing and pagingc++ 繁重的数据处理和分页
【发布时间】:2010-11-10 09:26:40
【问题描述】:

我正在编写一个应尽可能实时处理大量数据(1-10 GB 之间)的应用程序。

数据存在于硬盘上的多个二进制数据文件中,每个文件大小在几 kb 到 128MB 之间。当流程开始时,首先要确定实际需要哪些数据。然后通过用户界面获取一些用户设置,然后逐块处理数据,其中总是将文件加载到内存中,处理,然后从内存中清除。这种处理应该很快,因为用户可以更改一些设置,然后重新处理相同的数据,并且这种用户交互应该尽可能流畅。

现在从磁盘加载是相当大的瓶颈,我想在决定使用哪些文件的阶段预加载数据。但是 - 如果我预加载太多数据,操作系统将使用虚拟内存,并且我会遇到大量页面错误,从而使处理速度更慢。

如何确定要预加载多少数据以保持低页面错误?我可以以某种方式影响操作系统对我想保留在内存中的哪些数据吗?

谢谢!

//编辑:我目前在 Windows 7 64 上运行(但该应用程序是 32 位),并且该应用程序不需要在任何计算机上运行 - 仅在特定计算机上运行,​​因为这是一个研究项目。

【问题讨论】:

  • 您应该指定操作系统,因为答案很可能会针对特定平台

标签: c++ windows paging virtual-functions


【解决方案1】:

对于一般情况下对大型二进制文件的随机访问,我会考虑使用本机 OS 文件内存映射 API。从性能的角度来看,这很可能是最有效的解决方案,大多数操作系统中还有一个系统 API 可用于将页面锁定在内存中,但我不会使用它。当做一些更具体的事情时,在大多数情况下,可以通过智能索引来准确地知道什么在哪里,并以此解决大多数性能瓶颈。

是的,没有什么神奇的,如果您需要所有可用的 10G RAM,因为它们的访问频率相同,请在您的机器上获得 16GB 的 RAM。

【讨论】:

  • 许多操作系统允许一些关于您计划如何访问内存映射文件的提示 - 即顺序访问、随机访问等 - 他们将使用这些提示来决定缓存方法。此外,内存映射与问题指定 32 位应用程序的事实相冲突 - 就个人而言,我会非常认真地考虑将其移植到 64 位,然后让操作系统处理缓存和故障。为了增加在内存中拥有正确页面的机会,请考虑接下来使用任何特定页面的几率,如果不相等,请先采取措施对其进行故障排除。
【解决方案2】:

对于 Windows 平台,我建议您查看:

【讨论】:

    【解决方案3】:

    boost::interprocess中有文件映射支持

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-16
      • 2018-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多