如何强制C ++从磁盘分配内存?

我有成千上万的C ++代码行在小文本文件上运行良好,但在大文本文件(如2 GB大小)上崩溃。 崩溃的原因:应用程序吃内存。

是否可以从磁盘分配内存? 因为在大多数情况下,硬盘空间比物理内存大得多。 如果我可以从我的应用程序的硬盘借用一些空间,并在使用后返回,那么我的应用程序很less有机会崩溃。

这是我的devise思路:

  1. 创build文件映射的临时文件(CreateFileMapping,OpenFileMapping)
  2. 强制我的应用程序从临时文件分配内存
  3. 做一些清理工作:CloseFileMapping并删除临时文件

因为我有很多现有的代码,如果我的devise思想是合理的,我不想重新devise我的项目。

我不确定devise思想是否可以实现。 任何人都可以帮助我?

PS:我正在使用Visual C ++ 2010。

Solutions Collecting From Web of "如何强制C ++从磁盘分配内存?"

我有成千上万的C ++代码行在小文本文件上运行良好,但在大文本文件(如2 GB大小)上崩溃。 崩溃的原因:应用程序吃内存。

您正尝试将整个文件加载到32位系统(或具有2GB RAM的64位系统或运行在64位系统上的32位应用程序)上的内存中。 在32位系统上,无论你做什么,2 GB的文本文件都不会放入内存,因为使用32位寻址,即使具有分页文件,也可以在最大2 GB的RAM上进行操作。

解决方案。

  1. (最简单)逐行处理文件,无需将整个文件加载到内存中。
  2. 创建文件映射。 即使使用文件映射,您也无法一次访问整个文件,但可以将其部分映射到内存中。

如果地址空间不足,首先要查看哪些消耗内存,是否真的有必要。 您可能会发现允许使用较少的设计更改,或者只保留文件中的某些元素 – 常规文件不播放内存。

另一种可供选择的方法是将一些代码移植到不同的进程中。 使用COM不难启动和维护,并且服务器可以是一个64位的进程来避开虚拟地址的限制。 我希望不会比以磁盘为基础的想法更放慢,而且这绝对是比较简单的。

噢,我们跳过了第一件事:也许将项目转换为64位将解决问题。

如果你的问题不是虚拟空间,你只是想消耗少于1G的话,你唯一的朋友就是重新设计。 在这种情况下,我不会试图虚拟虚拟机,只要按照第一个项目符号写就可以了。

如果你使用C ++库编写你的算法,你可以看到这个问题和相关的答案。

我实际上使用内存映射文件来处理大数据文件(索引,排序,懒惰更新),我发现它不是容易,也不是执行。