CP-SAT 模型的 Google OR-Tools Java API 的 RAM 使用情况

问题描述 投票:0回答:1

我正在 OR-Tools 中使用 CP-SAT 模型的 Java 绑定。我的应用程序创建了一个大模型,但只保存了一些对一些 Int- 和 BoolVar 的引用。 我意识到在创建模型之后(甚至在我调用 CpSolver#solve 之前)。 Java 堆仅为模型分配了多个 GB。

我进行了堆转储并发现了以下条目:

 long []   (mostly part of IntegerVariableProto$Builder, > 13,000,000 inst.) => 1,433 MB
 com.google.ortools.sat.ConstraintProto$Builder (> 8,000,000 instances)      => 1,194 MB
 com.google.protobuf.SingleFieldBuilderV3       (> 21,000,000 instances)     =>   682 MB
 com.google.protobuf.GeneratedMessageV3$1       (> 21,000,000 instances)     =>   511 MB
 com.google.protobuf.IntArrayList               (> 13,000,000 instances)     =>   445 MB
 com.google.protobuf.LongArrayList              (> 13,000,000 instances)     =>   433 MB
 ...

我明白,大模型需要一些内存。 但在我查看了 Java 绑定代码后,在我看来,这些对象仅由 protobuf 使用来构建消息以将信息发送到本机后端。

我的问题是:

有没有什么方法可以使用 Java API,而不将这些对象保留在内存中(例如通过增量刷新模型)并且仍然引用 CpModel 和一些变量?

当我使用 C++ 时,它会如何表现? 我在这里很困惑,因为

我用 OR-Tools 版本 9.3 和 9.7 尝试过。

非常感谢。

java or-tools heap-dump cp-sat-solver
1个回答
0
投票

目前 Java 包装器相当轻量。一个 intVar 使用 2 个指针和 1 个 int32。这里没有多少收获,也没有多少可以删除的。

求解时,会将模型序列化为字符串,跨越C++/Java层,用C++重建proto,然后使用C++代码求解。

在 C++ 中执行此操作将删除一份副本和一份序列化。

在我看来,你有一个更大的问题需要解决。 上次我检查时,解决具有健康数量的工作人员的 12M 变量问题需要超过 256GB 的 RAM。

© www.soinside.com 2019 - 2024. All rights reserved.