2

何百もの HDF ファイルを読み込んで、各 HDF のデータを個別に処理しています。ただし、一度に 1 つの HDF ファイルを処理するため、これには非常に時間がかかります。http://docs.python.org/library/multiprocessing.htmlに出くわしたばかりで、マルチプロセッシングを使用してどのように高速化できるか疑問に思っています。

これまでのところ、私はこれを思いつきました:

import numpy as np
from multiprocessing import Pool

def myhdf(date):
    ii      = dates.index(date)
    year    = date[0:4]
    month   = date[4:6]
    day     = date[6:8]
    rootdir = 'data/mydata/'
    filename = 'no2track'+year+month+day
    records = read_my_hdf(rootdir,filename)
    if records.size:
        results[ii] = np.mean(records)

dates = ['20080105','20080106','20080107','20080108','20080109']
results = np.zeros(len(dates))

pool = Pool(len(dates))
pool.map(myhdf,dates)

しかし、これは明らかに正しくありません。私のやりたいことの連鎖をたどってもらえますか? 何を変更する必要がありますか?

4

2 に答える 2

5

より使いやすいラッパーとしてjoblibを試してください。multiprocessing

from joblib import Parallel, delayed

def myhdf(date):
    # do work
    return np.mean(records)

results = Parallel(n_jobs=-1)(delayed(myhdf)(d) for d in dates)
于 2012-10-25T11:38:03.623 に答える
2

プール クラスマップ関数は、標準の python ライブラリmap関数に似ており、結果を入れた順序で返すことが保証されています。その後、それらをフィルタリングします。

import numpy as np
from multiprocessing import Pool

def myhdf(date):
    year    = date[0:4]
    month   = date[4:6]
    day     = date[6:8]
    rootdir = 'data/mydata/'
    filename = 'no2track'+year+month+day
    records = read_my_hdf(rootdir,filename)
    if records.size:
        return np.mean(records)

dates = ['20080105','20080106','20080107','20080108','20080109']

pool = Pool(len(dates))
results = pool.map(myhdf,dates)
results = [ result for result in results if result ]
results = np.array(results)

利用可能になったらすぐに結果が必要な場合は、 imap_unorderedを使用できます

于 2012-10-25T09:52:15.313 に答える