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

时间:2013-06-08 08:50:12

标签: c++ windows visual-studio-2010

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

是否可以从磁盘分配内存?因为在大多数情况下,硬盘空间比物理内存大得多。如果我可以从我的应用程序的硬盘上借一些空间并在使用后将它们还原,那么我的应用程序几乎没有机会崩溃。

以下是我的设计思路:

  1. 为文件映射创建临时文件(CreateFileMapping,OpenFileMapping)
  2. 强制我的应用从临时文件中分配内存
  3. 做一些清理工作:CloseFileMapping并删除临时文件
  4. 因为我有很多现有的代码,如果我的设计思想合理,我不想重新设计我的项目。

    我不确定设计思想是否可以实现。有人可以帮帮我吗?

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

3 个答案:

答案 0 :(得分:3)

  

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

您正在尝试将整个文件加载到32位系统的内存中(或者在具有2GB RAM的64位系统上,或者在64位系统上运行的32位应用程序中)。在32位系统上,无论你做什么,2千兆字节的文本文件都不适合内存,因为使用32位寻址,你可以在2千兆字节的RAM上运行,即使它是由分页文件支持的。

解。

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

答案 1 :(得分:0)

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

另一个需要考虑的选择是将一些代码移植到另一个进程。使用COM并不难启动和维护,服务器可以是64位进程,避开虚拟地址限制。我希望不会比基于磁盘的想法更慢,而且它肯定更简单。

哦,是的,我们跳过第一件事:将项目转换为64位可能会解决问题。

如果你的问题不是虚拟空间,你只想在任何情况下消耗少于1G,你唯一的朋友就是重新设计。对于那种情况,我不会试图伪造虚拟机,就像在第一个子弹中写的一样。

答案 2 :(得分:0)

如果您使用C ++库编写算法,则可以看到this问题和相关答案。

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