如何在DASK中并行化双参数返回字典的函数,解决Delayed对象不可变报错
问题根源
报错核心原因是你在batch_opt函数内部对Dask Delayed对象执行了字典赋值操作,而Delayed对象是不可变的,不支持直接修改、新增键值对。
从报错栈可以定位到问题代码行是batch_opt函数内的validation_res[(train_mon_yr_batch, test_mon_yr)] = {xxx},这里的validation_res是Delayed类型,不是普通Python字典。
解决方法
第一步:修改batch_opt函数内部逻辑
在函数最开始就初始化一个普通Python空字典作为结果容器,不要用任何Dask操作生成的对象存结果:
def batch_opt(i, train): # 首行初始化普通空字典,避免使用Delayed对象作为容器 validation_res = {} # 其余原有业务逻辑保持不变 # ... # 后续对普通字典赋值,不会触发不可变错误 validation_res[(train_mon_yr_batch, test_mon_yr)] = { 'train_policy': train_policy_res, 'train_result': train_metrics_res, 'test_policy': test_policy_res, 'test_result': test_metrics_res } return validation_res
第二步:检查传入的train参数类型
如果你的train是Dask DataFrame类型,需要先确认是否满足以下两种情况之一:
- 数据量可以放进单worker内存:可以在外部先执行
train = train.compute()转成pandas DataFrame,再传给delayed包装的batch_opt - 数据量过大无法单机加载:建议改用Dask DataFrame原生的
map_partitions接口做分块并行处理,不要直接用delayed包装整个计算逻辑
第三步:原有外层并行代码无需修改
你写的外层循环+delayed+compute的逻辑本身没有问题,修改完batch_opt内部逻辑后直接运行即可。
内容的提问来源于stack exchange,提问作者Undecided
相关产品推荐
相关产品推荐

