C ++中的内存问题

我有一个C ++应用程序的运行时内存分配错误。 我已经消除了内存泄漏,无效指针引用和超出边界向量分配作为问题的来源 - 我非常确定这是与内存碎片有关的事情,我希望能够得到如何进一步诊断和纠正的帮助问题。

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

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

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

这种模式以及我所做的其他测试,让我相信这是一种分裂问题。 当我尝试调整矢量大小时,总会出现错误,但导致错误的特定大小调整操作会根据数据集大小而变化。 任何人都可以帮助我理解这里发生了什么,以及我如何解决它? 我可以更详细地描述事物,但已经感觉像我的帖子变得很长......如果需要,请提出问题,我会立即回复/编辑。

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

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位应用程序。 这可能使你达到你的目标。 您可能不得不增加页面文件的大小。
  • 看看你是否可以比现在更早地处理中间结果。
  • 尝试计算算法使用/将要使用多少内存,并尝试重新使用算法以使用更少的内存。
  • 尝试通过重新制定算法来避免重复数据。 我看到你有很多参考数据,从应用程序运行期间看,它不会改变。 你可以把所有这些都放到一个单独的向量中,然后你分配一次,然后通过其他地方的整数索引引用它们,而不是复制它们。 (只是猜测你正在复制它们)。
  • 尽量避免通过重新加工算法来批量处理所有数据。
  • 在不了解应用程序的情况下,不可能提供更好的建议。 但基本上,由于您正在分配大量的内存,因此基本上您的内存不足,并且基于您的应用程序和您发布的代码段,我认为您可以避免这样做,只需稍加思考即可。 祝你好运。

    链接地址: http://www.djcxy.com/p/63273.html

    上一篇: Memory Issues in C++

    下一篇: Increasing (or decreasing) the memory available to R processes