问题背景:
我在jupyter notebook中通过python-weka-wrapper3调用weka,原来一直可以正常使用。
在解决一个问题时,由于数据量较大,故使用multiprocessing包的Pool()进行并行计算。这时遇到了java.lang.NoClassDefFoundError错误。
系统:ubuntu
python-weka-wrapper3版本:0.1.16
python版本:3.6
报错信息如下:
我的代码如下:
from multiprocessing import Pool
pool = Pool(processes=10)
result = pool.map(score, permut)
pool.close()
pool.join()
——其中score函数调用weka中的类库,permut给出的是score的参数数组,也是在运行 pool.map()时出现了上面的报错信息
——另外,单独运行score函数,即不进行并行计算时,score函数可以正常输出结果
本人是计算机菜鸟,比较少提问,如果上述的问题有什么不清晰的地方或者有什么信息需要补充的话,请不吝赐教。
看错误应该是环境问题。
启动进程并行计算时,子进程的环境配置往往和主进程不一样。这应该也是你非并行时不报错的原因。
解决子进程环境问题应该就可以解决你的问题了。
给你提供点解决思路
1. 找到启动子进程的启动命令,可以用ps命令看
2. 直接执行启动命令,看是否可以正常运行
这个报错是 并行计算的问题,并不是weka类库的问题。
multiprocessing.Pool 只是用来启动多个进程而不是在每个core上启动一个进程,其实就是cpu个数。
map() 是Pool类中的map方法,与内置的map函数用法基本一致,它会使进程阻塞直到结果返回
你把processes数量降低试试看