Python使用Joblib并行时出现assignment destination is read-only错误如何解决
根本原因
你遇到的ValueError: assignment destination is read-only报错核心由Joblib loky多进程后端的内存优化机制导致:
- Joblib默认使用loky后端启动多进程时,为了降低父进程向子进程传递数据的内存拷贝开销,会将传递的大数据对象(此处为pandas groupby生成的每个group切片)封装为只读共享内存对象
- 你传入的
func函数内部尝试直接修改传入的group对象(比如新增列、修改单元格值等操作),就会触发只读内存的写入限制
可尝试的解决方法
- 方法1:在func内部先对传入的group做深拷贝再操作
无需修改外层逻辑,仅在func的第一行添加group = group.copy(deep=True),后续所有修改都针对拷贝后的可写对象执行即可,是成本最低的修复方案。 - 方法2:修改Joblib并行参数,关闭共享内存优化
给Parallel新增max_nbytes=None参数,强制所有数据走序列化拷贝而非共享内存传递,修改后的代码如下:
注意该方案在数据量较大时会提升内存占用。retLst = Parallel(n_jobs=(multiprocessing.cpu_count() // 2), max_nbytes=None)(delayed(func)(group, self.__class__.config) for name, group in dfgroup) - 方法3:调整func逻辑,不直接修改入参group
重写func实现,所有修改操作都基于原group生成新的DataFrame对象返回,完全避免修改入参,从根源上规避只读对象写入问题。
内容的提问来源于stack exchange,提问作者Sarvendra Singh
相关产品推荐
相关产品推荐

