有几个线程讨论Optaplanner的可扩展性,我想知道在数百万行时处理非常大的数据集的推荐方法是什么?
正如本博客所讨论的,我已经在使用启发式(模拟退火+禁忌搜索)。云平衡问题的搜索空间是c ^ p,但可行空间是未知/ NP完全的。
http://www.optaplanner.org/blog/2014/03/27/IsTheSearchSpaceOfAnOptimizationProblemReallyThatBig.html
我想解决的问题类似于云平衡。但主要区别在于输入数据,除了计算机列表和进程列表之外,还有一个大的二维“得分列表/表”,其中包含需要加载到内存中的每种可能组合的得分。
换句话说,除了计划需要满足的计算机和流程之间的约束外,不同的有效组合会产生不同的分数,分数越高越好。
这是一个简单的问题但是当谈到数百台计算机,100k +进程和得分表有一百万+组合时,它需要大量内存。尽管我可以分配更多内存来增加堆大小,但计划可能变得非常缓慢和挣扎,因为步骤是使用自定义计划变量/实体比较器类进行排序的。
一个直接的解决方案是将数据集划分为更小的子集,分别运行每个子集然后合并结果,这样我就可以让多台机器同时运行,每台机器在多线程上运行。这种方法的最大缺点是产生的结果远非最佳。
我想知道还有其他更好的解决方案吗?
答案 0 :(得分:0)
MachineReassignment示例还有一个很大的分数组合"矩阵。 OptaPlanner并不关心这一点 - 这些只是问题事实而且DRL很快就匹配了为作业挑选的组合。 Solver.solve()
不会导致大量内存消耗或性能影响。
但是,在代码中加载问题(在调用Solver.solve()
之前)导致大量内存消耗:了解如果n = 20k
,则{{ 1}}和n² = 400m
最多需要4个字节,因此对于 20 000个元素,矩阵为int
的最有效的非压缩形式1.6 GB
(均为Java和C ++!)。所以对于20k预留2GB RAM,40k预留8GB RAM,80k预留32GB RAM。这很糟糕。
至于处理这些大问题,我使用了附近选择的技术组合(参见我的博客文章),分区搜索(你所描述的,它将在7中开箱即用,但我和#39; ve为CustomPhase中的客户实施了它,有限选择建设启发式(需要进一步研究,管道在那里,通常是矫枉过正),...分区搜索确实排除了最佳解决方案,但超过10k计划实体权衡质量与时间明显有利于分区搜索给出合理的解决时间(分钟/小时/天而不是千年)。诀窍是保持每个分区的大小足够大,超过1k实体(因此使用NearbySelection)。当然,分数计算速度也很重要。