Python 多处理无法使用超过65536字节的训练数据训练Scikit学习模型

Python 多处理无法使用超过65536字节的训练数据训练Scikit学习模型,python,memory-management,scikit-learn,multiprocessing,pool,Python,Memory Management,Scikit Learn,Multiprocessing,Pool,我正在尝试使用Python的mulitprocessing库在单独的过程中从Scikit Learn中训练一系列集群模型。当我尝试使用multiprocess.Pool来训练模型时,代码运行时不会引发任何运行时错误,但执行永远不会完成 进一步的调查表明,只有当训练数据(下面的代码片段中的X)的内存大小超过2^16=65536字节时,代码才会终止。如果小于该值,则代码的行为符合预期 导入系统 将numpy作为np导入 来自多处理导入池 从sklearn.cluster导入KMeans #下面的代码

我正在尝试使用Python的
mulitprocessing
库在单独的过程中从Scikit Learn中训练一系列集群模型。当我尝试使用
multiprocess.Pool
来训练模型时,代码运行时不会引发任何运行时错误,但执行永远不会完成

进一步的调查表明,只有当训练数据(下面的代码片段中的
X
)的内存大小超过2^16=65536字节时,代码才会终止。如果小于该值,则代码的行为符合预期

导入系统 将numpy作为np导入 来自多处理导入池 从sklearn.cluster导入KMeans #下面的代码在乘数=227时执行并完成,但在乘数=228时不执行并完成 乘数=227 #一些随机训练数据 X=np.array( [[ 0.19276125, -0.05182922, -0.06014779, 0.06234482, -0.00727767, -0.05975948], [ 0.3541313, -0.29502648, 0.3088767, 0.02438405, -0.01978588, -0.00060496], [ 0.22324295, -0.04291656, -0.0991894, 0.04455933, -0.00290042, 0.0316047 ], [ 0.30497936, -0.03115212, -0.26681659, -0.00742825, 0.00978793, 0.00555566], [ 0.1584528, -0.01984878, -0.03908984, -0.03246589, -0.01520335, -0.02516451], [ 0.16888249, -0.04196552, -0.02432088, -0.02362059, 0.0353778, 0.02663082]] *乘数) #当乘数=227时打印65488,当乘数=228时打印65776 打印(“输入数据大小:”,sys.getsizeof(X)) #无论X的大小如何,无需多处理的训练始终有效 无多处理=KMeans(n_集群=2,n_作业=1).fit(X) 打印(“未完成多处理的培训!”)#始终打印 #当X太大时,多处理训练失败 def运行方式(X): 返回KMeans(n_集群=2,n_作业=1).fit(X) 池(进程=1)为p: 是\u多处理=p.map(运行\u kmeans,[X]) 打印(“完成多处理训练!”)#当乘数=228时不打印 我总是非常小心地将
n_jobs
参数设置为
1
None
,这样我的进程就不会产生自己的进程

奇怪的是,这个内存限制似乎并不是作为“每元素”内存限制内置于
多处理.Pool
,因为我可以传入一个非常长的字符串(消耗超过65536字节),代码会毫无怨言地终止

导入系统 来自多处理导入池 my_string=“这确实是一个愚蠢的字符串”*2500 打印(“字符串大小:,sys.getsizeof(y))#打印79554 def添加感叹号(x): 返回x+“!” 池(进程=1)为p: my_string=p.map(添加感叹号,[my_string]) 打印(“多处理完成!”)#打印效果良好 挂起第一个代码段时终止其执行始终会导致以下错误消息:

文件“/path/to/my/code”,第29行,在
是\u多处理=p.map(运行\u kmeans,[X])
文件“/…/anaconda3/envs/Main36Env/lib/python3.6/multiprocessing/pool.py”,地图第266行
返回self.\u map\u async(func、iterable、mapstar、chunksize).get()
get中的文件“/…/anaconda3/envs/Main36Env/lib/python3.6/multiprocessing/pool.py”,第638行
self.wait(超时)
文件“/…/anaconda3/envs/Main36Env/lib/python3.6/multiprocessing/pool.py”,第635行,正在等待
self.\u事件等待(超时)
文件“/…/anaconda3/envs/Main36Env/lib/python3.6/threading.py”,第551行,正在等待
信号=自身。第二次等待(超时)
文件“/…/anaconda3/envs/Main36Env/lib/python3.6/threading.py”,第295行,正在等待
服务员
键盘中断
我已经尝试强制我的MacOS系统生成进程,而不是像建议的那样分叉它们。我已经研究了一些建议,比如,和(直接从终端执行python代码),但没有结果。更改
进程的数量也没有影响。我还尝试了从
multiprocessing.Pool
切换到
multiprocessing.Process
,以避免daemonic
Pool
进程试图从KMeans
joblib
集成中生成进程,但没有成功


如何在训练数据超过65536字节的单独进程上训练多个KMeans模型?

经过多次尝试和错误后,问题似乎是环境错误,因为在新环境中运行上述代码是有效的。我不完全确定是我的哪些软件包导致了这个问题。

经过更多的尝试和错误,这个问题似乎是环境错误,因为在一个新的环境中运行上述代码是有效的。我不完全确定是我的哪些软件包导致了这个问题