【问题标题】:How can I speed up my Python Code by multiprocessing (parallel-processing)?如何通过多处理(并行处理)加速我的 Python 代码?
【发布时间】:2017-09-17 11:25:33
【问题描述】:

我的python代码的功能非常简单。它通过文件列表读取 netCDF 文件并在这种情况下返回平均值。

但是,读取 netCDF 文件需要时间。我想知道我可以通过多处理(并行处理)来加速这个过程,因为我的工作站有 32 核处理器。

代码如下:

from netCDF4 import Dataset

for i in filerange:
    print "Reading the",i, "file", "Wait"
    infile_Radar = Dataset(file_list[i],'r')

    # Read the hourly Data
    Radar_rain=np.array(infile_Radar.variables['rain'][:])

    for h in range(0,24):
        hourly_rain = Radar_rain[h,:]
        hourly_mean[i,h] = np.mean(hourly_rain)

np.savetxt('Hourly_Spatial_mean.txt', hourly_mean, delimiter='\t')

既然读取文件是相互独立的,那么如何才能充分利用我的工作站呢?谢谢。

【问题讨论】:

  • 线程,而不是多处理,似乎更适合 IO 密集型任务。
  • 分发进程的方法有很多种,但是,你必须确保输出不会相互覆盖。
  • 我看不到您在哪里阅读文件。您可以通过将一个流上的读取与处理另一个流重叠来获得一些改进,但这种扩展只能到此为止。
  • 我编辑了代码。 @tdelaney。可以使用独特的指示器来修复覆盖。但我不知道分配过程的方式。你能给我一些提示吗?@mootmoot
  • 再解释一下:“读取文件是相互独立的”.

标签: python parallel-processing multiprocessing netcdf


【解决方案1】:

您似乎正在寻找一个相当标准的线程实现。假设阻塞部分是 Dataset 构造函数,您可能想要执行以下操作:

from threading import Thread

def CreateDataset( offset, files, datasets ):
   datasets[offset] = Dataset( files[i], 'r' )


threads   = [None] * len( filerange )
data_sets = [None] * len( filerange )

for i in filerange:
   threads[i] = Thread( None, CreateDataset, None, ( i, file_list, data_sets ) )
   threads[i].start();

for t in threads:
   t.join()

# Resume work with each item in the data_sets list
print "All Done";

然后为每个数据集执行您详细说明的其余工作。无论真正的“慢东西”在哪里,这都是基本方法。

【讨论】:

    猜你喜欢
    • 2020-09-06
    • 2021-11-06
    • 2022-12-14
    • 2023-03-08
    • 2021-12-18
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多