2017-10-03 4 views
1

기존 코드 중 일부를 병렬 처리하려고합니다. 완료 될 때마다 각 반복의 출력을 저장하여 전체 루프를 메모리에 저장하지 않아도됩니다. 기본적으로 다음과 같은 내용이 있습니다 :Python : 다중 처리를 사용하여 각 반복마다 Pickle 출력

import cPickle as pickle 
from multiprocessing import Pool 

if __name__ == '__main__': 
    outf = open('test_mp.pkl', 'wb') 

    def f(x): 
     pickle.dump([x, x*x], outf, -1) 
     return x*x 

    pool = Pool(4) 
    out = pool.map(f, range(100)) 
    print out 

코드가 오류없이 실행되고 'out'에 대한 올바른 값을 생성합니다. 내가 생산 된 피클 파일을 읽으려고 그러나, 아무것도 전혀 기록 된 것 같다 :

>>> f = open('test_mp.pkl', 'rb') 
>>> pickle.load(f) 
--------------------------------------------------------------------------- 
EOFError         Traceback (most recent call last) 
<ipython-input-4-4d7131bbd231> in <module>() 
----> 1 pickle.load(f) 

EOFError: 

내가 피클로 덤프 할 수없는 이유에 대한 손실에 현재 해요 루프의 중간에있는 객체. 다중 처리 (즉, for 루프)없이이 코드를 시도했지만 정상적으로 작동합니다.

또한이 함수를 main() 외부로 옮기고 추가 인수로 'outf'를 전달했습니다. 이 메서드는 닫힌 파일에 쓰려고 시도하는 것에 대한 오류를 제공합니다.

루프가 병렬 처리 될 때 출력을 피클 파일에 저장할 수 있습니까?

+0

다른 프로세스 * 상태를 공유하지 않습니다 *. –

답변

0

동일한 파일 핸들에 동시에 액세스하려는 스레드에 문제가 발생합니다. 대신 .dumps 메서드를 사용하여 목록으로 피클 링 한 다음 결합 된 bytearray를 파일 끝에 덤프 할 수 있습니다. 그렇지 않으면 각 프로세스에서 개별 파일 핸들로 피클 할 수 있으므로 각 프로세스마다 하나의 파일을 갖게됩니다.

또한 산세 처리는 방대한 양의 데이터를 저장하는 이상적인 방법이 아닙니다. HDF5 (http://www.h5py.org/)와 같이 엄청난 수치 데이터 저장에 적합한 파일 형식이 특별히 설계되었습니다. h5py 구현은 매우 성숙하고 사용하기 쉽고 데이터를 병렬로 저장할 수 있습니다.

관련 문제