【问题标题】:allocate huge memory in MFC在 MFC 中分配巨大的内存
【发布时间】:2012-12-30 19:12:32
【问题描述】:

有时我需要处理巨大的 PDF 文件,在这种情况下,我会在循环中使用一些 new 运算符,这是一个如此巨大的循环,以至于将使用超过 10 GB 的内存。众所周知,我必须使用一些WIN API函数来使用硬盘。但我不知道如何实现它。谁能帮帮我?

这是一个代码sn-p:

CMyObject gg_data;
for(__int64 i = 0; i < up_limit(__int64); ++i)
{
   //add new data to the PDF file
   CCAry pData = new CCAry("myData");
   gg_data.AddRef(pData);
}

//after the loop, save file and free memory so that no memory leaks occur...
//Caution: the "save" is a very expensive work, it will take several hours!!!
gg_data.save();

【问题讨论】:

  • 10GB PDF 文件。 文件之母...
  • 您能否详细说明您分配内存的具体内容以及您如何使用这些内存?整个文件?如果是这样,您是否修改内存中的文件?另外,您的系统是 32 位还是 64 位?
  • 我想将自己的一些数据添加到现有的PDF文件中,并做一些修改工作。我希望我的应用程序可以在 x86 和 x64 上运行。而且我使用的是 Visual C++ 2010。
  • 你可能需要像file mapping这样的东西
  • 这里是关于文件映射的限制 - stackoverflow.com/questions/726471/…

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


【解决方案1】:

如果您想使用特定于 Windows 的分配调用,您可能应该选择VirtualAlloc()。但我猜想使用new 已经在分配虚拟内存,所以Windows 也应该负责分页到硬盘。

如果您使用如此大量的内存,您可能需要增加硬盘上页面文件的大小。

【讨论】:

  • 为什么您在原始问题中提供的代码对您不起作用?
【解决方案2】:

Memory mapped files 是你想要的。 这会将文件映射到内存的“缓冲区”,操作系统会为您管理它,以便您可以像处理大块 RAM 一样操作文件。

【讨论】:

  • 如果文件大于 ~1GB,内存映射在 32 位 Windows 上会很棘手。
  • 你能给我更具体的细节吗?
  • @AlexeyFrunze 但是分配内存也是如此,所以内存映射文件并不比替代方案差
猜你喜欢
  • 2012-12-21
  • 1970-01-01
  • 2013-09-15
  • 1970-01-01
  • 2023-03-03
  • 2012-04-16
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
相关资源
最近更新 更多