에러 해결

[에러해결] pickle load()시 'UnpicklingError: invalid load key'

체봄 2022. 5. 10. 11:02

에러 메시지: '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'))

 이렇게 쓰면 된다는 말도 있었는데 역시 작동하지 않았다.

 

반응형