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个唯一值。
有效代码(在这个特定的例子中):
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的内存。 你正试图分配更多。
在不了解应用程序的情况下,不可能提供更好的建议。 但基本上,由于您正在分配大量的内存,因此基本上您的内存不足,并且基于您的应用程序和您发布的代码段,我认为您可以避免这样做,只需稍加思考即可。 祝你好运。
链接地址: http://www.djcxy.com/p/63273.html上一篇: Memory Issues in C++
下一篇: Increasing (or decreasing) the memory available to R processes