c ++重数据处理和分页

Mat*_*Mat 6 c++ windows paging virtual-functions

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

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

现在从磁盘加载是一个相当大的瓶颈,我想在已确定将使用哪些文件的阶段预先加载数据.但是 - 如果我预加载太多数据,操作系统将使用虚拟内存,我将有大量的页面故障,使处理速度更慢.

如何确定要预加载多少数据以保持页面故障低?我可以以某种方式影响我想要保留在内存中的数据吗?

谢谢!

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

bob*_*bah 3

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

是的,这并不神奇,如果您需要所有 10G RAM 可用(因为它们的访问频率相同),请在您的机器上选择 16GB RAM。

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