gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:52:45 26 4
gpt4 key购买 nike

我在使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com