2012-04-21 5 views
3

여러 사전을 pickle 및 unpickle하는 서버에서 여러 스크립트가 실행 중입니다.Python pickling dictionary EOFError

SellerDict=open('/home/hostadl/SellerDictkm','rb') 
SellerDictionarykm=pickle.load(SellerDict) 
SellerDict.close() 

SellerDict=open('/home/hostadl/SellerDictkm','wb') 
pickle.dump(SellerDictionarykm,SellerDict) 
SellerDict.close() 

모든 스크립트는 그 중 하나를 제외하고 잘 실행 : 아래 그림과 같이 그들은 모두 산세에 대해 동일한 기본 코드를 사용합니다. 문제가있는 웹 사이트는 여러 웹 사이트로 이동하여 데이터를 스크랩하고 사전에 저장합니다. 이 코드는 하루 종일 절임 및 unpickling 사전을 실행하고 자정에 중지합니다. cronjob 다음 아침에 다시 시작 다음날 아침. 이 스크립트는 문제없이 몇 주 동안 실행할 수 있지만 사전을 열려고하면 EOFError로 인해 스크립트가 한 달에 한 번 죽습니다. 사전의 크기는 대개 약 80MB입니다. SellerDict.close() 전에 SellerDict.flush()를 추가하여 데이터를 pickling 할 때 저녁이 플러시되는 것을 확인하기까지했습니다.

어떤 생각이 원인 일 수 있습니까? 파이썬은 매우 견고하여 파일의 크기 때문이라고 생각하지 않습니다. 코드가 죽기 전에 오랜 시간 동안 잘 돌아가는 곳에서는이 문제를 일으키는 사전에 뭔가가 저장되어 있을지도 모릅니다. 그러나 나는 전혀 모른다.

또한 피클 이외의 사전을 저장하는 더 좋은 방법을 알고 있다면 옵션을 사용할 수 있습니다. 앞서 말했듯이, 사전은 끊임없이 열리고 닫힙니다. 설명을 위해 하나의 프로그램 만 동일한 사전을 사용하므로 동일한 사전에 액세스하려는 여러 프로그램에서 문제가 발생하지 않습니다.

는 UPDATE : 여기

내가 로그 파일에서이 역 추적입니다. 여기

import pickle 

# define initial dict 
orig_dict={'foo':'one'} 

# write dict to file 
writedict_file=open('./mydict','wb') 
pickle.dump(orig_dict,writedict_file) 
writedict_file.close() 

# read the dict from file 
readdict_file=open('./mydict','rb') 
mydict=pickle.load(readdict_file) 
readdict_file.close() 

# now we have new data to save 
new_dict={'foo':'one','bar':'two'} 
writedict_file=open('./mydict','wb') 
#pickle.dump(orig_dict,writedict_file) 
#writedict_file.close() 

# but...whoops! before we could save the data 
# some other reader tried opening the file 
# now they are having a problem 
readdict_file=open('./mydict','rb') 
mydict=pickle.load(readdict_file) # errors out here 
readdict_file.close() 

출력입니다 :

Traceback (most recent call last): 
    File "/home/hostadl/CompileRecentPosts.py", line 782, in <module> 
    main() 
    File "/home/hostadl/CompileRecentPosts.py", line 585, in main 
    SellerDictionarykm=pickle.load(SellerDict) 
EOFError 
+0

어떤 종류의 잠금 전략을 사용하고 있습니까? –

+0

잠금 전략을 사용하고 있지 않습니다 ... – jordanskis

답변

2

는 여기 잠금을 사용하지 않는 경우 발생하는 상황 결국

python pickletest.py 
Traceback (most recent call last): 
    File "pickletest.py", line 26, in <module> 
    mydict=pickle.load(readdict_file) # errors out here 
    File "/usr/lib/python2.6/pickle.py", line 1370, in load 
    return Unpickler(file).load() 
    File "/usr/lib/python2.6/pickle.py", line 858, in load 
    dispatch[key](self) 
    File "/usr/lib/python2.6/pickle.py", line 880, in load_eof 
    raise EOFError 
EOFError 

, 일부 읽기 과정은 절인 파일을 읽으려고 할 것입니다 쓰기 프로세스에는 이미 쓰기가 열려 있습니다. 파일을 읽으 려하기 전에 다른 프로세스가 이미 파일을 쓰기 위해 열려 있는지 여부를 알 수있는 방법이 있는지 확인해야합니다.

매우 간단한 해결책은 this thread that discusses using Filelock입니다.

+2

AJ, 답변 해 주셔서 감사합니다. 그러나 하나의 프로그램 만 각 사전을 사용합니다. 따라서 현재 프로세스가 사용 중이거나 쓰고있는 사전을 읽거나 열려고하는 다른 프로세스가 없습니다. – jordanskis

+1

질문에 전체 추적을 포함 할 수 있습니까? –

+0

원본 질문을 추적 목록으로 업데이트했습니다. 당신의 도움을 주셔서 감사합니다! – jordanskis

5

그래서 실제로 이것은 메모리 문제로 판명되었습니다. 컴퓨터의 RAM이 부족하여 데이터를 언 피클하거나로드하려고하면 프로세스가이 EOFError를 실패하게됩니다. 나는 컴퓨터의 RAM을 늘리지 만 이것은 결코 다시는 문제가되지 않습니다.

모든 의견과 도움에 감사드립니다.

+2

평균적으로 당신이 산란하고 unpickling하는 사전은 얼마나 큰가요? – Algorithmatic