C ++中的内存问题

时间:2013-09-05 13:48:40

标签: c++ memory-management

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

我的代码太大而无法发布(大约15,000行 - 我知道不是很大但显然太大而无法上线),因此我将使用一些相关的代码片段来描述事物。

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

然而,当我扩展时,我开始得到内存分配错误,但我认为我甚至接近我的系统的内存限制 - 请看下面的两个图...我的程序循环一系列场景(在每个场景的不同参数集下执行相同的计算) - 在第一个图中,我在大约200个条目的数据集上运行7个场景。如图所示,每个“周期”导致内存向上和向下回到其基线,并且整体内存使用量很小(参见底部图形右半部分的七个小点)。在第二张图上,我现在运行的数据集大约有10,000个条目(请参阅下面有关数据集的说明)。在这种情况下,我只能在得到错误之前经历2个完整周期(因为它试图为第三个场景调整类对象的大小)。您可以在右下半部分图中看到前两个场景;比以前更多的内存使用量,但仍然只是可用内存的一小部分。与较小的数据集一样,在我的场景运行时,使用率会增加,然后在到达下一个场景之前降低到初始值。

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

澄清数据集 数字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;
};

1 个答案:

答案 0 :(得分:3)

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

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

如果不了解您的应用程序,就不可能提供更好的建议。但基本上你的内存不足是因为你分配了大量的内存,而且根据你的应用程序和你发布的片段,我认为你可以避免这样做,只需要一点点思考。祝你好运。