2017-04-05 13 views
2

私はforループに渡したファイルのリストを持っていて、たくさんの機能を持っています。これを並列化する最も簡単な方法は何ですか?私はこの正確なものをどこにでも見つけることができるとは確信していません。私が行ったいくつかの読書から、これは完全に平行なケースでなければならないと私は思う。forループを使用したマルチプロセッシングプール

古いコードは次のようなものです:

import pandas as pd 
filenames = ['file1.csv', 'file2.csv', 'file3.csv', 'file4.csv'] 
for file in filenames: 
    file1 = pd.read_csv(file) 
    print('running ' + str(file)) 
    a = function1(file1) 
    b = function2(a) 
    c = function3(b) 
    for d in range(1,6): 
      e = function4(c, d) 
    c.to_csv('output.csv') 

(間違って)並列化コード

import pandas as pd 
from multiprocessing import Pool 
filenames = ['file1.csv', 'file2.csv', 'file3.csv', 'file4.csv'] 
def multip(filenames): 
    file1 = pd.read_csv(file) 
    print('running ' + str(file)) 
    a = function1(file1) 
    b = function2(a) 
    c = function3(b) 
    for d in range(1,6): 
      e = function4(c, d) 
    c.to_csv('output.csv') 

if __name__ == '__main__' 
    pool = Pool(processes=4) 
    runstuff = pool.map(multip(filenames)) 

(だと思う)は私がやりたいことは1ファイルがあること持っています計算されたコアあたり(多分プロセスあたり?)私はまた、

multiprocessing.cpu_count() 

を行なったし、(私はそのアカウントは、おそらくスレッドを考慮そうクワッドを持っている)8を得ました。私は約10ファイルの合計があるので、私は物事をスピードアップするプロセスごとに1つのファイルを置くことができれば素晴らしいだろう!私は残りの2つのファイルが最初のラウンドからのプロセスも完了した後にプロセスを見つけることを願っています。機能(すなわち、function1、function2など)は、それぞれのファイル内の他の機能(すなわち、function1a、function1b)にも供給される。別ウィンドウ(タブ)の大きな表示で見るインポート文を使って関数1を呼び出します。

私は次のエラーを取得する:

OSError: Expected file path name or file-like object, got <class 'list'> type 

はどうやらリストを渡されて好きではありませんが、それは一つだけのファイル

を実行しますので、私は、if文でファイル名[0]を行うにはしたくありません

答えて

1
import multiprocessing 
names = ['file1.csv', 'file2.csv'] 
def multip(name): 
    [do stuff here] 

if __name__ == '__main__': 
    #use one less process to be a little more stable 
    p = multiprocessing.Pool(processes = multiprocessing.cpu_count()-1) 
    #timing it... 
    start = time.time() 
    for file in names: 
    p.apply_async(multip, [file]) 

    p.close() 
    p.join() 
    print("Complete") 
    end = time.time() 
    print('total time (s)= ' + str(end-start)) 

EDIT:if__name __ == '____main___'をスワップアウトします。これにより、すべてのファイルが実行されます。

if __name__ == '__main__': 

    p = Pool(processes = len(names)) 
    start = time.time() 
    async_result = p.map_async(multip, names) 
    p.close() 
    p.join() 
    print("Complete") 
    end = time.time() 
    print('total time (s)= ' + str(end-start)) 
関連する問題