从ddf.map_partitions调用中访问公用资源时,性能较差

时间:2019-06-18 13:34:44

标签: pandas dask netcdf python-xarray

从dask.dataframe.map_partitions函数中访问全局.nc文件时,确实遇到性能问题。

某些背景: 我有大量的netCDF文件,其值被映射为lat + lon值。对于每条val + lat + lon行,我想计算到惯性运动值的距离。

由于所有数据集无法一次放入内存,因此我考虑使用dask.dataframe(ddf)。我已经生成了ddf,现在要添加dist2coast列。这是我的伪代码:

def get_dist2coast(latarr, lonarr, do_interp=True, cfilepath='~/data/dist2coast/dist2coast_1deg.nc'):
""" Calculates distance to coast."""
    #
    # access global/common dist2coast_1deg.nc file
    # e.g.:
    #
    # ds = xr.open_dataset('~/data/dist2coast/dist2coast_1deg_merged.nc')
    # return d2c_vec based on lat+lon values

ddf = ddf.map_partitions(lambda df: df.assign(dist2coast=get_dist2coast(df.lat, df.lon, do_interp=False)))

这段代码大约需要20秒钟。如果我使用内存中的pandas数据帧,则大约需要7秒钟。

我的第一个猜测是,不良的性能来自调用get_dist2coast的各个线程之间的某些锁定行为。 dist2coast_1deg_merged.nc包含经纬度网格上的到海岸的距离值。

为此,我并不是真的依靠轻松的性能优化。但可以肯定,我将在以后的处理步骤中受益。

您怎么看?有办法解决这种锁定行为吗?

1 个答案:

答案 0 :(得分:0)

  

这段代码大约需要20秒钟。如果我使用内存中的pandas数据帧,则大约需要7秒钟。

如果您可以让Pandas为您工作,那几乎总是一个更好的选择。

https://docs.dask.org/en/latest/best-practices.html#start-small

  

我的第一个猜测是,不良的性能来自调用get_dist2coast的各个线程之间的某些锁定行为。 dist2coast_1deg_merged.nc包含经纬度网格上的到海岸的距离值。

也许。我建议对您的代码进行性能分析,以查看速度较慢。学习这将有助于引导您取得良好的成绩。

https://docs.dask.org/en/latest/understanding-performance.html