c++ - C++ 中的内存问题

标签 c++ memory-management

我在使用 C++ 应用程序时遇到运行时内存分配错误。我已经消除了内存泄漏、无效指针引用和越界 vector 分配作为问题的根源——我很确定这与内存碎片有关,我希望得到有关如何进一步诊断和纠正问题的帮助问题。

我的代码太大而无法发布(大约 15,000 行 - 我知道不是很大但显然太大而无法放到网上),所以我将用一些相关的代码片段来描述事情。

基本上,我的程序将一堆字符串和数值数据集作为输入(具有 double、string、int 和 bool 类型 vector 变量的类对象),执行一系列计算,然后吐出结果数字。我已经测试并重新测试了计算和输出 - 一切都在按预期进行计算,并且在较小的数据集上运行完美。

然而,当我扩大规模时,我开始遇到内存分配错误,但我认为我什至没有接近系统的内存限制 - 请看下面的两张图......我的程序循环一系列场景(在每个场景的不同参数集下执行相同的计算)——在第一张图中,我在大约 200 个条目的数据集上运行 7 个场景。如图所示,每个“周期”都会导致内存上下摆动至其基线,并且总体内存使用量很小(请参见底部图表右半部分的七个小点)。在第二张图中,我现在正在运行一个包含大约 10,000 个条目的数据集(请参阅下面的数据集注释)。在这种情况下,在出现错误之前我只经历了 2 个完整的周期(因为它正在尝试为第三种情况调整类对象的大小)。您可以在右下半图中看到前两个场景;内存使用量比以前多很多,但仍然只占可用内存的一小部分。与较小的数据集一样,在我的场景运行时使用量会增加,然后在到达下一个场景之前减少回到初始水平。

这种模式,连同我做过的其他测试,让我相信这是某种碎片问题。当我尝试调整 vector 大小时,错误总是发生,尽管导致错误的特定调整大小操作因数据集大小而异。任何人都可以帮助我了解这里发生了什么以及我如何解决它吗?我可以更详细地描述事情,但我已经觉得我的帖子越来越长了...如果需要,请提出问题,我会及时回复/编辑。

对数据集的澄清 数字 200 和 10,000 代表我正在分析的唯一记录的数量。每条记录包含 75 到 200 个元素/变量,其中许多元素/变量随后被操纵。此外,每个变量都随着时间的推移和多次迭代(两个维度变量)而被操纵。因此,对于平均“记录”(上面提到的 200 到 10,000),与之关联的值可能很容易多达 200,000 个 - 示例计算:

1 条记录 * 75 个变量 * 150 个周期 * 20 次迭代 = 每条记录 225,000 个唯一值。

SmallDataRun

LargeDataSetRun

违规代码(在此特定实例中):

vector<LoanOverrides> LO;
LO.resize(NumOverrides + 1); // Error is occuring here.  I am certain that NumOverrides is a valid numerical entry = 2985

// Sample class definition
class LoanOverrides {
public:
  string IntexDealName;
  string LoanID;
  string UniqueID;
  string PrepayRate;
  string PrepayUnits;
  double DefaultRate;
  string DefaultUnits;
  double SeverityRate;
  string SeverityUnits;
  double DefaultAdvP;
  double DefaultAdvI;
  double RecoveryLag;
  string RateModRate;
  string RateModUnits;
  string BalanceForgivenessRate;
  string BalanceForgivenessRateUnits;
  string ForbearanceRate;
  string ForbearanceRateUnits;
  double ForbearanceRecoveryRate;
  string ForbearanceRecoveryUnits;
  double BalloonExtension;
  double ExtendPctOfPrincipal;
  double CouponStepUp;
};

最佳答案

您有一个能够分配大量内存的 64 位操作系统,但将您的应用程序构建为 32 位应用程序,最多只能分配大约 3GB 的内存。您正在尝试分配更多。

  • 尝试编译为 64 位应用程序。这可以帮助您实现目标。您可能需要增加页面文件的大小。
  • 看看您是否可以比当前更早地处理中间结果。
  • 尝试计算您的算法正在使用/将使用多少内存,并尝试修改您的算法以减少使用。
  • 通过重新设计您的算法来尝试避免重复数据。我看到您有很多引用数据,从外观上看,这些数据在应用程序运行期间不会改变。您可以将所有这些放入一个 vector 中,分配一次,然后在其他地方通过整数索引引用它们,而不是复制它们。 (只是猜测您正在复制它们)。
  • 通过重新设计您的算法以批量处理来尝试避免一次加载所有数据。

如果不进一步了解您的应用程序,就不可能提供更好的建议。但基本上你正在耗尽内存,因为你正在分配大量的内存,并且根据你的应用程序和你发布的片段,我认为你可以稍微考虑一下就可以避免这样做。祝你好运。

关于c++ - C++ 中的内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18638148/

相关文章:

linux - 内核页面是否被换出?

objective-c - 当 int 在另一个循环中递增时如何管理它?

c++ - 科学计数法数字的正则表达式?

.net - .NET 是 "all COM underneath"吗?

c++ - 树在递归时不维护迭代器成员

objective-c - 为什么在 Objective-C 库中使用 ARC 时会出现警告?

c - 如何仅使用标准库分配对齐的内存?

iphone - 保留属性时内存泄漏

c++ - 如何从发布版本的回溯中恢复符号?

c++ - 从类模板创建对象的工厂函数模板?