首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CPLEX:释放模型(资源)需要大量时间

CPLEX:释放模型(资源)需要大量时间
EN

Stack Overflow用户
提问于 2021-01-03 18:49:25
回答 1查看 94关注 0票数 0

我正在解决一个MIP,并且已经构建了一个相应的CPLEX IloModel。我的实现遵循以下伪代码:

代码语言:javascript
复制
model = IloModel( env );

//Build optimization model

//Configure CPLEX Solver

//Solve model

//Do some solution-statistics

model.end();

一切都很好,我得到了正确的解决方案,等等。现在,我想按顺序自动解决许多不同的实例。

然而,在这里我遇到了一个问题:我的实例越大,使用model.end()释放资源所需的时间就越长。对于我的小实例(使用高达500mb的RAM),它已经需要几十分钟,对于中等大小的实例(使用高达2 GB的RAM),它需要几个小时,我从来没有测量过我的大实例(使用高达32 GB的RAM)需要多长时间,因为我总是在它没有完成整个晚上的等待后手动终止进程。因此,释放资源比构建模型或使用我指定的时间限制解决它需要更长的时间。当model.end()运行时,CPU使用率始终保持在100%左右。

这是预期的行为吗?我是不是在实现我的模型的过程中遗漏了什么,或者如何释放需要花费这么多时间的资源?

我真的希望避免通过在指定的时间阈值后终止CPLEX解算进程来自动依次解算多个实例。

谢谢!

编辑:我可以通过运行env.end() (即使对于大型模型也需要<1)而不是model.end()来绕过这个问题。因为我现在没有重用这个环境,所以这对我来说是可以的。然而,我想知道这里发生了什么,从我从docs收集的信息来看,释放分配给模型的资源是释放整个环境的子过程。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-14 17:36:40

我猜,但是你在终止模型之前终止了求解器吗?求解器正在使用模型,因此会收到有关其更改的通知。这可能是因为model.end()没有优化,当它一个接一个地释放约束时,求解器会收到每个特定更改的通知,它会更新自己的数据结构等。

换句话说,我认为在model.end()之前调用cplex.end()可能会解决这个问题。

如果可以,最好在每次求解后调用env.end()。正如你注意到的,它更快:一次释放所有资源更容易,因为不需要检查是否仍然需要特定的资源(例如,一个变量可以被多个模型使用)。它也更安全,因为新模型是从头开始的,内存泄漏的风险也被最小化了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65548944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档