web-dev-qa-db-ja.com

Python 3の '​​for'ループを並列化する

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を使って何かを試しましたが、できませんでした。

この問題への対処方法がわかりません。

5

私の推測では、同時に複数のファイルで作業したいと思います。そのためには、(私の意見では)multiprocessingを使用するのが最善の方法です。これを使用するには、基本ステップを定義する必要があり、それはすでにコードで行われています。

import numpy as np
import multiprocessing as mp
import os

def compute(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 __== '__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])

これにより、要素resultsのリストが返されます。各要素は、ファイル名とmindex行列を持つタプルです。これにより、同時に複数のファイルで作業できます。各ファイルの計算が長い場合は特に効率的です。

0
Mathieu