5

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

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

以下是我的设计思路:

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

因为我现有的代码太多,如果我的设计思路合理,我不想重新设计我的项目。

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

PS:我使用的是 Visual C++ 2010。

4

3 回答 3

4

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

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

解决方案。

  1. (最简单)逐行处理文件,无需将整个文件加载到内存中。
  2. 创建文件映射。即使使用文件映射,您也无法一次访问整个文件,但您可以将部分文件映射到内存中。
于 2013-06-08T11:01:57.313 回答
0

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

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

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

如果您的问题不在于虚拟空间,那么无论如何您只想消耗少于 1G,那么您唯一的朋友就是重新设计。对于这种情况,我不会尝试伪造虚拟机,只需按照第一个项目符号中所述进行操作。

于 2013-06-09T09:55:32.690 回答
0

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

我实际上使用内存映射文件来处理大型数据文件(索引、排序、延迟更新),但我发现它既不简单也不高效。

于 2013-06-09T11:05:55.200 回答