【发布时间】:2011-05-02 11:03:33
【问题描述】:
我有一种情况,我需要处理大量 (15-30) 个大型(数百 mb)数据结构。它们不会同时进入记忆。更糟糕的是,在它们上运行的算法适用于所有这些结构,即不是第一个,而是另一个等等。我需要尽可能快地做到这一点。
所以我想我会在磁盘上分配内存,在将数据加载到内存时基本上是数据的直接二进制表示的文件中,并使用内存映射文件来访问数据。我使用例如 50 兆字节的 mmap“视图”(一次将 50 mb 的文件加载到内存中),所以当我有 15 个数据集时,我的进程使用 750 mb 的内存来存储数据。最初是可以的(用于测试),当我有更多数据时,我会以一些速度为代价将 50 mb 调低。
但是,这个启发式现在是硬编码的(我知道我将测试的数据集的大小)。 “在野外”,我的软件需要能够确定要分配的“正确”内存量以最大限度地提高性能。我可以说“我的目标是使用 500 mb 的内存”,然后将 500 除以数据结构的数量以得出 mmap 视图大小。我发现当试图将此“目标内存使用”设置得太高时,虚拟内存管理器磁盘抖动将(几乎)锁定机器并使其无法使用,直到处理完成。在我的“生产”解决方案中要避免这种情况。
所以我的问题,解决问题的方法都有些不同:
单个进程的“最佳”目标大小是多少?我应该尝试最大化我拥有的 2gb(假设 32 位 Win XP 及更高版本,现在非/3GB)还是尝试保持我的进程大小更小,以便我的软件不会占用机器?当我在我的机器上打开 2 个 Visual Studio、Outlook 和 Firefox 时,它们自己很容易使用 1/2 gb 的虚拟内存——如果我让我的软件使用 2 gb 的虚拟内存,交换将严重减慢机器的速度。但是然后我如何做确定“最佳”进程大小。
在处理内存映射文件时,我可以做些什么来检查机器的性能?我的应用程序对数据进行了相当简单的数值运算,这基本上意味着它可以快速压缩数百兆字节的数据,从而导致整个内存映射文件(几千兆字节)被加载到内存中并再次非常快速地再次换出一次又一次(想想蒙特卡洛风格的模拟)。
是否有可能不使用内存映射文件而仅使用 fseek/fgets 会比使用内存映射文件更快或更少干扰?
我可以阅读任何关于此的文章、论文或书籍吗?使用“食谱”风格的解决方案或基本概念。
谢谢。
【问题讨论】:
-
指定 64 位操作系统,问题已解决。
-
是的,希望我能在几年内做到这一点......
-
@Hans - 今天 64 位和 32 位的渗透率是多少?这似乎是限制性的,也许在 10 年内它会是合理的。
-
@Steve - 这是您从戴尔购买机器时的默认操作系统选择。过去一年左右一直如此。
-
@Hans - 谢谢 - 我不会只在 64 位上建立业务。虽然在这个应用程序的情况下,如上所述,它可能更容易要求。
标签: c++ memory-management