pythonxarray在多线程中运行缓慢

2024-09-26 17:51:04 发布

您现在位置:Python中文网/ 问答频道 /正文

尊敬的xarray python用户:

我有一段代码,其中加载了一些xarray数据集,在函数之间传递,通过计算创建,最后写入。 这些操作必须以可操作的方式在全球多个地区进行。由于每个区域都是独立的(没有加载相同的数据),我可以使用main创建线程(使用多处理工具箱)或在单独的终端中手动启动不同的区域

当我启动一个区域时,我有合理的处理时间。函数线程内没有任何多处理,因此在我的htop中,它只使用8个可用cpu核上的1个cpu核,并且代码的cProfile将导致以下结果:

Thu Jul 30 10:54:01 2020    Tahiti.txt

         2190436 function calls (2150695 primitive calls) in 131.330 seconds

   Ordered by: cumulative time
   List reduced from 9195 to 10 due to restriction <10>

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
   1722/1    0.013    0.000  131.332  131.332 {built-in method builtins.exec}
        1    0.049    0.049  131.332  131.332 main_b_GHI_Tahiti.py:1(<module>)
        1    0.529    0.529   65.203   65.203 /home/ubuntu/SteadySat/Codes/steadysat-python/dev/Irradiance/base_pvlib.py:43(pvlib_turbidity_optim)
        1   29.864   29.864   60.960   60.960 /home/ubuntu/SteadySat/Codes/steadysat-python/dev/cloud_forecast/Cloud_Forecasting.py:71(Cloud_Wind)
       34    1.664    0.049   54.530    1.604 /home/ubuntu/SteadySat/Codes/steadysat-python/dev/Irradiance/base_pvlib.py:97(Projection_ombre)
       34   38.775    1.140   42.352    1.246 /home/ubuntu/SteadySat/Codes/steadysat-python/dev/Irradiance/base_pvlib.py:124(Projection_ombre_optim)
        1    3.268    3.268   23.795   23.795 /home/ubuntu/SteadySat/Codes/steadysat-python/dev/cloud_forecast/Cloud_Forecasting.py:135(Wind_Map)
       34    0.000    0.000   20.541    0.604 /home/ubuntu/anaconda3/envs/steadysat/lib/python3.7/site-packages/scipy/io/matlab/mio.py:83(loadmat)
       13    0.000    0.000   20.496    1.577 /home/ubuntu/anaconda3/envs/steadysat/lib/python3.7/site-packages/scipy/io/matlab/mio5.py:254(get_variables)
       13    0.000    0.000   20.493    1.576 /home/ubuntu/anaconda3/envs/steadysat/lib/python3.7/site-packages/scipy/io/matlab/mio5.py:235(read_var_array)

现在,如果我启动两个或多个区域(在不同的终端中,相同的代码),计算时间会慢得多(这里是时间2,我必须慢8倍),htop显示进程在D状态下花费了很长时间(等待),cpu的工作效率不高。我必须精确地指出,相同的代码,使用相同的消耗操作,但使用非优雅的numpy实现可以很好地工作(在计算多个区域时没有实际的时间损失)。 在本例中,cProfile显示了完全不同的结果,因为排名前十的不是我耗时的函数,而是xarray

Thu Jul 30 09:31:14 2020    Tahiti.txt

         2190294 function calls (2150553 primitive calls) in 358.310 seconds

   Ordered by: cumulative time
   List reduced from 9195 to 10 due to restriction <10>

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
   1722/1    0.012    0.000  358.313  358.313 {built-in method builtins.exec}
        1    0.030    0.030  358.313  358.313 main_b_GHI_Tahiti.py:1(<module>)
6017/4415    0.142    0.000  234.321    0.053 {built-in method numpy.array}
4142/2546    0.003    0.000  234.198    0.092 /home/ubuntu/anaconda3/envs/steadysat/lib/python3.7/site-packages/numpy/core/_asarray.py:16(asarray)
  111/109    0.001    0.000  234.172    2.148 /home/ubuntu/anaconda3/envs/steadysat/lib/python3.7/site-packages/xarray/core/indexing.py:555(__array__)
      109    0.001    0.000  234.163    2.148 /home/ubuntu/anaconda3/envs/steadysat/lib/python3.7/site-packages/xarray/backends/netCDF4_.py:71(__getitem__)
      109    0.003    0.000  234.162    2.148 /home/ubuntu/anaconda3/envs/steadysat/lib/python3.7/site-packages/xarray/core/indexing.py:809(explicit_indexing_adapter)
      109    0.002    0.000  234.151    2.148 /home/ubuntu/anaconda3/envs/steadysat/lib/python3.7/site-packages/xarray/backends/netCDF4_.py:76(_getitem)
      109  234.122    2.148  234.137    2.148 {built-in method _operator.getitem}
      173    0.001    0.000  234.135    1.353 /home/ubuntu/anaconda3/envs/steadysat/lib/python3.7/site-packages/xarray/core/dataarray.py:555(values)

如果有人知道是什么原因导致了这个问题,那将是非常有帮助的。我只在datarray上使用了很少的函数:open_dataset,sel,to_netcdf,但我可以看到,在begging中,只使用open_dataset和sel,计算时间增加了

提前谢谢


Tags: toinpy区域homeubuntulibpackages

热门问题