2017-04-05 5 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)) 

나는 (생각) 내가하고 싶은하나의 파일이 것은 수 무엇 코어 당 을 계산했습니다. (아마 프로세스마다?). 또한

multiprocessing.cpu_count() 

을했고, (나는 그것의 아마 계정 스레드를 고려 그래서 쿼드가) (8)를 얻었다. 나는 약 10 개의 파일을 가지고 있기 때문에 프로세스 당 하나의 파일을 넣으면 속도가 빨라집니다. 첫 번째 라운드의 프로세스가 완료된 후에 나머지 2 개의 파일이 프로세스를 찾길 바란다. 더 명확하게하기 위해, 기능들 (즉, function1, function2 등)은 또한 각각의 파일들 내의 다른 기능들 (즉, 기능 1a, 기능 1b)을 공급한다. import 문을 사용하여 함수 1을 호출합니다.

나는 다음과 같은 오류 얻을 :

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

은 분명히 목록을 전달되기 싫어하지만 난하고 싶지 않아을 파일 이름 [0]에서 그 하나 개의 파일 만 실행되기 때문에 if 문

답변

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)) 

편집 : 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))