将netcdfs转换为zarr并重新分块时,CPU使用率较低

问题描述

我正在将数据从netcdf传输并重新分配给zarr。该过程很慢,并且没有使用很多CPU。我尝试了几种不同的配置,有时似乎做得更好,但是效果不佳。有没有人有任何技巧可以使运行效率更高?

最后一次尝试(以及先前尝试的一些,也许是全部)(在单机,分布式调度程序和使用线程的情况下),日志给出了以下消息:

distributed.core-信息-事件循环在Worker中无响应10.05s。这通常是由于长时间运行的GIL保持功能或移动大数据块引起的。

CPU utilization. It starts low,and then drops even lower.

以前我在内存耗尽方面存在错误,因此我使用下面的“ stepwise_to_zarr”函数来逐段编写zarr:

def stepwise_to_zarr(dataset,step_dim,step_size,chunks,out_loc,group):
    start = dataset[step_dim].min()
    end = dataset[step_dim].max()
    iis = np.arange(start,end,step_size)
    if end > iis[-1]:
          iis = np.append(iis,end)
            
    lon=dataset.get_index(step_dim)
    
    first = True
    failures = []
    for i in range(1,len(iis)):
        lower,upper = (iis[i-1],iis[i])
        if upper >= end:
            lon_list= [l for l in lon if lower <= l <= upper]

        else:
            lon_list= [l for l in lon if lower <= l < upper]
        sub = dataset.sel(longitude=lon_list)

        rechunked_sub = sub.chunk(chunks)
        write_sync=zarr.ThreadSynchronizer()

        if first:
            rechunked_sub.to_zarr(out_loc,group=group,consolidated=True,synchronizer=write_sync,mode="w")
            first = False
        else:
            rechunked_sub.to_zarr(out_loc,append_dim=step_dim)


chunks = {'time':8760,'latitude':21,'longitude':20}
ds = xr.open_mfdataset("path to data",parallel=True,combine="by_coords")
stepwise_to_zarr(ds,step_size=10,step_dim="longitude",chunks=chunks,out_loc="path to output",group="group name")

在上面的图中,利用率从〜6%下降至〜0.5%似乎与完成的第一个10度纬度“批次”相符。

背景信息:

  • 我正在使用一个32个vCPU和256 GB内存的GCE实例。
  • 数据约为600 GB,分布在约150个netcdf文件中。
  • 数据在GCS中,我正在使用Cloud Storage FUSE读取和写入数据。
  • 我正在将数据从块大小:{'time':1,'latitude':521,'longitude':1440}重分配为chunksizes:{'time':8760,'latitude':21,'longitude' :20}

我尝试过:

  • 使用默认的多处理调度程序
  • 对进程= True和进程= False的单个计算机(https://docs.dask.org/en/latest/setup/single-distributed.html)使用分布式调度程序。
  • 分布式调度程序和默认的多处理调度程序,同时还设置环境变量以避免过度订阅线程,例如:
export OMP_NUM_THREADS=1
export MKL_NUM_THREADS=1
export OPENBLAS_NUM_THREADS=1

如最佳做法中所述(https://docs.dask.org/en/latest/array-best-practices.html?highlight=export#avoid-oversubscribing-threads

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)