pickle序列化xarray Dataset时报cannot pickle '_thread.lock'错误问询
报错原因
你遇到的TypeError: cannot pickle '_thread.lock' object错误是xarray.open_dataset默认的延迟加载机制导致的:
- 调用
xr.open_dataset打开nc文件时,xarray不会立刻把所有数据读取到内存中,仅会读取元数据,保留和源文件的关联句柄,实际数据仅在需要计算/访问时才会加载 - 这个文件关联句柄内部包含
_thread.lock线程锁对象,而pickle序列化规则不支持序列化锁、文件句柄这类系统级资源,因此直接序列化未加载的Dataset就会抛出该错误
解决方案
你可以选择以下任意一种方案解决问题:
- 方案1:将数据集全量加载到内存后再序列化
调用.load()方法将所有数据读取到内存中,断开与源nc文件的句柄关联,即可正常序列化:import xarray as xr import pickle ds = xr.open_dataset('62030_prec_1995.nc').load() pkl = pickle.dumps(ds, protocol=-1) - 方案2:使用xarray专属存储格式(更推荐)
pickle序列化存在跨xarray版本不兼容、存储效率低的问题,优先使用xarray原生支持的格式存储数据集:- 存为netCDF格式:
ds.to_netcdf('output.nc'),读取时直接用xr.open_dataset('output.nc')即可 - 大体积数据集可存为Zarr格式:
ds.to_zarr('output.zarr'),支持分块、并行读写
- 存为netCDF格式:
内容的提问来源于stack exchange,提问作者AkariYukari
相关产品推荐
相关产品推荐

