在 Python 3 中并行化 'for' 循环
parallelize 'for' loop in Python 3
我正在尝试对 MODIS 卫星数据进行一些分析。我的代码主要读取大量 1200 x 1200 (806*1200*1200) 尺寸的文件 (806)。它使用 for loop
并执行数学运算。
以下是我读取文件的一般方式。
mindex=np.zeros((1200,1200))
for i in range(1200):
var1 = xray.open_dataset('filename.nc')['variable'][:,i,:].data
for j in range(1200):
var2 = var1[:,j]
## Mathematical Calculations to find var3[i,j]##
mindex[i,j] = var3[i,j]
由于要处理的数据很多,这个过程很慢,我正在考虑将其并行化。我尝试用 joblib
做一些事情,但我没能做到。
我不确定如何解决这个问题。
我猜您想同时处理多个文件。为此,最好的方法(在我看来)是使用 multiprocessing
。要使用它,您需要定义一个基本步骤,它已经在您的代码中完成了。
import numpy as np
import multiprocessing as mp
import os
def f(file):
mindex=np.zeros((1200,1200))
for i in range(1200):
var1 = xray.open_dataset(file)['variable'][:,i,:].data
for j in range(1200):
var2 = var1[:,j]
## Mathematical Calculations to find var3[i,j]##
mindex[i,j] = var3[i,j]
return (file, mindex)
if __name__ == '__main__':
N= mp.cpu_count()
files = os.scandir(folder)
with mp.Pool(processes = N) as p:
results = p.map(f, [file.name for file in files])
这应该是 return 一个元素列表 results
,其中每个元素都是一个包含文件名和 mindex 矩阵的元组。有了它,您可以同时处理多个文件。如果每个文件的计算很长,它会特别有效。
我正在尝试对 MODIS 卫星数据进行一些分析。我的代码主要读取大量 1200 x 1200 (806*1200*1200) 尺寸的文件 (806)。它使用 for loop
并执行数学运算。
以下是我读取文件的一般方式。
mindex=np.zeros((1200,1200))
for i in range(1200):
var1 = xray.open_dataset('filename.nc')['variable'][:,i,:].data
for j in range(1200):
var2 = var1[:,j]
## Mathematical Calculations to find var3[i,j]##
mindex[i,j] = var3[i,j]
由于要处理的数据很多,这个过程很慢,我正在考虑将其并行化。我尝试用 joblib
做一些事情,但我没能做到。
我不确定如何解决这个问题。
我猜您想同时处理多个文件。为此,最好的方法(在我看来)是使用 multiprocessing
。要使用它,您需要定义一个基本步骤,它已经在您的代码中完成了。
import numpy as np
import multiprocessing as mp
import os
def f(file):
mindex=np.zeros((1200,1200))
for i in range(1200):
var1 = xray.open_dataset(file)['variable'][:,i,:].data
for j in range(1200):
var2 = var1[:,j]
## Mathematical Calculations to find var3[i,j]##
mindex[i,j] = var3[i,j]
return (file, mindex)
if __name__ == '__main__':
N= mp.cpu_count()
files = os.scandir(folder)
with mp.Pool(processes = N) as p:
results = p.map(f, [file.name for file in files])
这应该是 return 一个元素列表 results
,其中每个元素都是一个包含文件名和 mindex 矩阵的元组。有了它,您可以同时处理多个文件。如果每个文件的计算很长,它会特别有效。