[에러해결] pickle load()시 'UnpicklingError: invalid load key'
에러 메시지: 'UnpicklingError: invalid load key ' 또는 'Segmentation fault (core dumped)'
(라이브러리 버전에 따라 다르게 출력되는 듯함)
pickle을 이용해 리스트를 파일로 저장하고 로드를 할 때, 1기가 파일에 대해서는 문제가 없었지만 같은 형식의 7기가 파일에 대해서는 에러가 났다.
구글링해보니 파일의 크기가 대략 2기가가 넘어가면 로드 시 자주 에러가 발생하는 것 같았다.
구글링을 통해 온갖 방법을 다 해보았는데 결국 해결되지 않았고 데이터 저장 과정에서 문제가 발생해 데이터 자체가 유효하지 않다는 판단을 내렸다. 결론은 파일을 지우고 다시 저장해야된다는 것이다.
나처럼 어떤 데이터를 파일로 직접 저장했다면 그 데이터 포맷으로 저장하는 과정을 처음부터 다시 수행하고, 허깅페이스 같은 곳에서 다운로드 받은 것이라면 다시 다운로드를 받아야 한다.
내가 시도했던 방법들을 더보기에 적어둔다. (해결에 도움되진 않았음)
1. C 기반 pickle 사용하기 (python 3 버전)
import _pickle
with open('파일명.pickle', 'rb') as f:
data = _pickle.load(f)
2. C 기반 pickle 사용하기 (python 2 버전)
import cPickle
with open('파일명.pickle', 'rb') as f:
data = cPickle.load(f)
3. 데이터가 유효한지 확인하기
import pickle
with open('파일명.pickle', 'rb') as f:
p = pickle.Unpickler(f)
data = p.load() # 여기서 에러나면 데이터가 유효하지 않은 것
f.close()
4. gzip 사용하기
import gzip
import shutil
# 기존 파일을 gzip으로 압축
with open('파일명.pickle', 'rb') as f_in:
with gzip.open('파일명.pickle.gz', 'wb') as f_out:
shutil.copyfileobj(f_in, f_out)
# gzip 압축 파일을 열기
with gzip.open('파일명.pickle.gz', 'rb') as f:
data = f.read()
이 방법은 에러 없이 돌아가긴 했으나 원래 데이터 수와 터무니 없이 차이가 나서 사용하지 않았다.
5. joblib 사용하기
import joblib
with open('파일명.pickle', 'rb') as f:
data = joblib.load(f)
pickle/_pickle/cPickle 사용 시 에러가 얼마 지나지 않아 바로 발생했는데, 이 방법은 좀 오래 돌아가다가 에러가 발생했다. Segmentation Fault 또는 KeyError가 발생했다.
6. with 쓰지 않고 한번에 적기
import pickle
data = pickle.load(open('파일명.pickle', 'rb'))
이렇게 쓰면 된다는 말도 있었는데 역시 작동하지 않았다.