Web Crawling, 데이터 통계, 분석, ML 등을 진행하다 보면 생성되는 데이터들이 꽤 많다.
물론 Raw data를 기반으로 매번 script를 실행하여 보고 싶은 데이터를 생성하기도 하지만 자주 사용 하는, 혹은, 할 데이터라면 매번 script를 실행하고 처리하는 것도 시간과 비용이 들어간다.
그래서 이번에는 내가 자주 사용하는 데이터를 저장하고 읽어오는 방법을 정리 해보고자 한다.
주로 사용하는 라이브러리는 pickle이다.
Pickle
모듈은 파이썬 객체 구조의 직렬화와 역 직렬화를 위한 바이너리 프로토콜을 구현한다.Warning: The
python.orgpickle
module is not secure. Only unpickle data you trust.
pickle은 알아 본 것과 같이 클래스 자체를 통채로 파일로 저장했더가 그대로 불러 올 수 있으며 불러오면 클래스 그대로 복원된다. 또한, binary 형태로 저장되기 때문에 저장용량이 작아지는 특징도 있다. 주로 gzip 이라는 라이브러리를 통해 한번 더 압축하게 되는데 그러면 용량이 또 매우 작아진다.(평가 시, pickle 대비 약 15%의 용량 수준)
그러나!!!! pickle 모듈은 안정성이 확보되지 않는다. 반드시 내가 신뢰할 수 있는 pickle data만 unpickle해야 한다. 온라인에서 구한 pickle에는 unpickle시 임의의 코드를 실행하는 pickle data를 구성할 수 있다고 경고하고 있다.
dict_data를 pickle로 저장하기
import pickle
dict_data = {'school_name': ['A', 'B', 'C'],
'total_students_enrolled': [637, 363, 411],
'test_score': [10.0, 9.0, 9.0]}
#save
with open('dict_data.pickle', 'wb') as f:
pickle.dump(dict_data, f, pickle.HIGHEST_PROTOCOL)
#load
with open('dict_data.pickle', 'rb') as f:
dict_data = pickle.load(f)
추가로 gzip을 사용하게 되면 pickle 데이터를 추가로 압축하여 작은 용량으로 저장하게 된다.
import pickle
import gzip
#save
with gzip.open('dict_data_zip.pickle', 'wb') as f:
pickle.dump(dict_data, f)
#load
with gzip.open('dict_data_zip.pickle', 'rb') as f:
dict_data = pickle.load(f)