Python 以线程方式与DASK并行打开文件+;CFGrib真的很慢
我一直在使用以下代码构建一个GRIB文件读取工具。我有异构文件,所以不能使用xarray.open_mfdataset或类似的东西Python 以线程方式与DASK并行打开文件+;CFGrib真的很慢,python,dask,cfgrib,Python,Dask,Cfgrib,我一直在使用以下代码构建一个GRIB文件读取工具。我有异构文件,所以不能使用xarray.open_mfdataset或类似的东西 def create_open_delays(file_list: List[str],expected_dataset_count:int) -> List[Delayed]: """ This function runs through list of files and creates a list
def create_open_delays(file_list: List[str],expected_dataset_count:int) -> List[Delayed]:
"""
This function runs through list of files and creates a
list of delayed open commands.
"""
return [
dask.delayed(cfgrib.open_datasets,nout=expected_dataset_count)(file,
backend_kwargs={
"indexpath": ""
},
cache=True) for file in file_list
]
在运行代码时,我注意到线程并行运行的性能比完全进程并行运行的性能降低了10倍(每个Dask工作线程只有一个线程)。我猜这和吉尔有关,我猜对任何人来说都不会感到意外。DASK文档确实强调了这是一个优化机会。拥有如此多的工作人员有一些缺点,因为他们现在的内存有限,启动所有工作人员会带来额外的开销,更不用说更多的进程通信了。每个任务大约需要10秒钟,因此我不担心Dask.delayed的过度使用
我有两个问题:
谢谢。如果你还没有看过,我建议你看看Xarray,至少看看他们是如何处理Grib的。如果你还没有看过,我建议你看看Xarray,至少看看他们是如何处理Grib的。问题是我有异构的Grib文件。xarray接口允许您进行过滤,但这样做13次会变得非常不方便。根据我对xarray和CFGrib源代码的理解,带有CFGrib后端的xarray函数最终使用的函数与CFGrib对应的函数大致相同。对于dask端,您还有什么其他提示吗?我可以只使用每个核心一个进程,但该程序将训练一个神经网络,它在多线程上的性能会更好。有更好的办法吗?谢谢你的提示:)问题是我有异构的Grib文件。xarray接口允许您进行过滤,但这样做13次会变得非常不方便。根据我对xarray和CFGrib源代码的理解,带有CFGrib后端的xarray函数最终使用的函数与CFGrib对应的函数大致相同。对于dask端,您还有什么其他提示吗?我可以只使用每个核心一个进程,但该程序将训练一个神经网络,它在多线程上的性能会更好。有更好的办法吗?谢谢你的提示:)