我正在使用 PuLP 和 Python 进行一些优化,因为我的数据很大,所以我决定尝试多线程,因为我的问题很大,即选择
但是,在测试主要问题的一小部分(10k 而不是 1M 人)时,我无法让多线程实际使用多个线程。
我按照说明使用Coin-OR 网站上描述../configure --enable-cbc-parallel
的标志从源代码构建求解器;一切都很好,所有的测试都通过了。我检查了 CBC 配置登录,它在第 845 行有消息,所以它肯定可以工作。build/Cbc/config.log
configure:30105: Cbc multithreading enabled
系统:
- Mac OS X 10.14.3
- i7-4870HQ 四核
- Python 3.6.7 w/Anaconda
- 在 Jupyter 和从命令行在 Python 解释器中运行时都会出现问题
代码,类似于此处的示例:
start = time.time()
solver = solvers.COIN_CMD(~/Cbc-2.9/build/Cbc/src/cbc',threads=8,msg=1,fracGap = 0.01)
prob.solve(solver)
print('time to solve:',time.time()-start,'seconds')
>> time to solve: 24.815305948257446 seconds
如果我指定了多线程求解器或者我只使用了默认求解器,那么那个时间大致相同。
在运行时的 CBC 消息中有一行:
threads was changed from 0 to 8
还有以下几行:
Cbc0012I Integer solution of -25507 found by DiveCoefficient after 0 iterations and 0 nodes (18.04 seconds)
Cbc0030I Thread 0 used 0 times, waiting to start 0.291008, 0 cpu time, 0 locks, 0 locked, 0 waiting for locks
Cbc0030I Thread 1 used 0 times, waiting to start 0.24997687, 0 cpu time, 0 locks, 0 locked, 0 waiting for locks
Cbc0030I Thread 2 used 0 times, waiting to start 0.21034408, 0 cpu time, 0 locks, 0 locked, 0 waiting for locks
Cbc0030I Thread 3 used 0 times, waiting to start 0.17122722, 0 cpu time, 0 locks, 0 locked, 0 waiting for locks
Cbc0030I Thread 4 used 0 times, waiting to start 0.13530493, 0 cpu time, 0 locks, 0 locked, 0 waiting for locks
Cbc0030I Thread 5 used 0 times, waiting to start 0.098966837, 0 cpu time, 0 locks, 0 locked, 0 waiting for locks
Cbc0030I Thread 6 used 0 times, waiting to start 0.062871933, 0 cpu time, 0 locks, 0 locked, 0 waiting for locks
Cbc0030I Thread 7 used 0 times, waiting to start 0.028151035, 0 cpu time, 0 locks, 0 locked, 0 waiting for locks
Cbc0030I Main thread 0 waiting for threads, 1 locks, 0.00077700615 locked, 9.5367432e-07 waiting for locks
Cbc0001I Search completed - best objective -25507, took 0 iterations and 0 nodes (18.29 seconds)
这意味着所有线程都已创建但未使用?
我想到但不知道如何解决的一种解决方案:也许我的求解器路径是错误的,即 COIN_CMD 求解器不应该被定向到.../cbc
其他东西。我还没有找到任何东西。
那么我做错了什么?我找不到有关如何使用线程的任何其他文档。希望这是一个简单的解决方案的愚蠢问题。谢谢你的帮助。