CPLEX内存不足,无例外

时间:2013-10-22 14:20:35

标签: exception out-of-memory cplex

我正在通过COIN / OSI界面(OsiCpxSolverInterface)运行CPLEX。对于某些大型LP,我收到错误消息CPX0000 CPLEX Error 1001: Out of memory. 尽管出现错误消息,但不会抛出任何异常(CoinError)。查看source code of OsiCpxSolverInterface看起来CPXlpopt的返回码必须为0。

要明确:我的问题不是如何避免内存不足的问题。我只是想找一种从程序中检测它的方法。

1 个答案:

答案 0 :(得分:0)

我发现了一个适合我的黑客攻击。将错误处理程序日志级别设置为0仅允许错误消息通过。覆盖MessageHandler的print方法然后允许对错误做出反应。这种解决方法绝对是一种黑客行为。如果有人有更好的建议,我很乐意接受不同的答案。

class ErrorCatchingCoinMessageHandler: public CoinMessageHandler {
public:
    ErrorCatchingCoinMessageHandler()
        : CoinMessageHandler() {
        // Would be nice to also overwrite setLogLevel to avoid later changes
        // but its not virtual
        setLogLevel(0);
    }

    virtual int print() __attribute__((noreturn)) {
        CoinMessageHandler::print();
        abort(); // or throw a CoinError
    }
};

// Use it like this

lp_solver->passInMessageHandler(new ErrorCatchingCoinMessageHandler());