2014-06-23 3 views
-2

cPickle을 사용하여 큰 (몇 GB) 파일을 덤프하는 프로그램이 있습니다. 작은 파일 (5.6GB의 파일 중 가장 큰 파일)에서는 잘 작동하지만 큰 파일에서는 자동으로 실패합니다 (!).큰 파일을 파이썬으로 쓰지 않고 자동 응답하지 못했습니다.

관련성이 있는지 확실하지 않지만 복수 노드을 다중 처리하여 동시에 여러 노드에 생성 및 작성하고 있습니다. 이 문제는 h4py을 사용하여 HDF5에 대용량 파일을 쓰려고 할 때 비슷한 문제가 발생하여 Pickle에 국한되지 않는 것으로 의심됩니다.

어떤 일이 벌어 질지 궁금하십니까?

일부 추가 정보 : EXT4 파일 시스템이있는 Linux에서 실행됩니다. 충분한 RAM (60GB + 120GB 스왑 ... 아니요 MemoryError) 이상을 가져야하며 각 프로세스는 별도의 파일에서 작동합니다. 프로세스가 죽지 않습니다 ... 각 반복마다 큰 파일을 계산하고 덤프하는 루프가 있습니다. 파일이 너무 크면 덤프되지 않고 오류 메시지 나 무언가가 잘못되었다는 다른 표시 (누락 된 파일 제외)없이 루프의 다음 반복이 진행됩니다.

import numpy as np 
import cPickle 
import multiprocessing as mp 

def test(): 
    test = np.random.random(1000000000) 
    # test = np.random.random(10000) # this works 
    cPickle.dump(test, open('/home/ctw/tmp/test.pickle','w'), -1) 

po = mp.Pool(1) 
po.apply_async(test) 
po.close() 

결과는 빈 파일의 창조 :

는 다음 동작을 재현 최소한의 샘플입니다.

In [32]: cPickle.dump(test, open('/home/ctw/tmp/test.pickle','w'), -1) 
--------------------------------------------------------------------------- 
SystemError        Traceback (most recent call last) 
<ipython-input-32-62283b59a617> in <module>() 
----> 1 cPickle.dump(test, open('/home/ctw/tmp/test.pickle','w'), -1) 

SystemError: error return without exception set 

또 다른 갱신 : 나는 멀티 프로세싱 환경 외부에서이 프로그램을 실행할 때, 보통의 결과는 작은 (127B) 파일의 작성 및 다음과 같은 오류 메시지 (I이 사용하는 멀티 프로세싱을 실행할 때 오류가 볼 수 없습니다)입니다 : 프로토콜 대신 -1 대신 0을 사용하면 파일이 작성됩니다.

+1

정보가 부족하기 때문에이 질문에 대한 답변을 얻으려면 [trace] (https://docs.python.org/2/library/trace.html#command-line-usage)를 사용하여 프로세스를 실행 해보십시오.) 당신에게 문제의 방향을 알려주거나 어떤 일이 벌어 지는지, 다중 프로세스를 사용하여 프로세스 1 개로 제한하려고한다면 (예, 더 많은 시간이 걸릴 것입니다.) 프로세스간에 충돌이 있는지를 알려줄 것입니다. –

+0

일부 '파일 시스템'에는 크기 제한이있을 수 있습니다. 예를 들어 FAT32는 4GB로 제한됩니다. – furas

+0

리눅스 시스템을 사용하는 경우, 시스템이 프로세스를 죽일 수 있으므로 RAM이 부족하지 않은지 확인하십시오. – goncalopp

답변

0

분명히 파이썬3.3 중 2 ** 31-1 바이트 프로토콜에 대한 cpickle 파일 크기에 고유 한 제한이 있습니다. 여전히 성가신/이상한 멀티 프로세싱 중에 오류 메시지가 없다.

관련 문제