본문 바로가기

Pythonic Python

Pickle: 일일이 저장하기 귀찮다면?

Python3 공식 Document에 보면

 

pickle 모듈은 파이썬 객체 구조의 직렬화와 역 직렬화를 위한 바이너리 프로토콜을 구현....

과 같은 설명이 적혀있다.

 

하지만, 간단하게 생각하면 pickle은 현재 상태를 저장할 수 있는 모듈이라고 생각하면 될 거 같다.

 

pickle을 잠시 떠나서, 우리가 어떤 객체의 상태를 저장해야 하는 상황이라고 생각해보자.

 

많은 변수들이 있는데, 이걸 다 일일이 Text나 Binary로 바꾼다고 생각해보자.

 

상당히 귀찮고, 실수할 여지가 많을 수 있다.

 

이런 걸 한 번에 해결하는 게 pickle이라고 생각하면 될 거 같다.

 

이렇게 파이썬 객체의 계층구조를 Byte Stream으로 바꾸는 것을 Pickling 혹은 Serialization, 다시 Byte Stream을 객체 구조로 바꾸는 것을 Unpickling 혹은 Deserialization이라고 한다.

사용

import pickle
name_list = ['jason', 'james', 'stella']
with open('list.pickle', 'wb') as f:
	pickle.dump(name_list, f) #입력
with open('list.pickle', 'rb') as f:
	name_list = pickle.load(f) #load 파일을 한 줄 씩 불러오고 로드할 data가 없으면 EOFError 발생

#encoding이 default(ASCII)와 다른 경우
name_list = pickle.load(f, encoding = 'utf-8')

 

이런 식으로 사용하면 된다.

 

list를 하나 선언하고 dump 함수를 사용하여, list.pickle이라는 파일에다가 Pickling을 한다.

 

반대로 다시 Unpickling 할 때는, load 함수를 사용하여 불러오면 된다.

 

여기서 주의해야 할 점은, encoding이 다를 경우에는 명시를 해야 Error가 나지 않는다.

 

특히, 한글이 들어간 객체는 utf-8로 되어있을 가능성이 높다!

cPickle

Python Pickle은 file I/O를 거쳐야 하기 때문에 데이터가 많아질 경우, 혹은 Real Time으로 서비스해야 하는 경우에는 성능이 문제가 될 수 있다.

 

cPickle은 C로 구현되어 있기 때문에 성능면에서 이런 부분을 어느 정도 해결할 수 있다.

 

Python 버전 별 사용 방법은 다음과 같다.

 

import cPickle #Python 2.x. Python 2.x는 pip install cPickle로 설치해야 함.
import _pickle #Python 3.x. Python 3.x는 기본 내장.

 

주의해야 할 점은, cPickle은 Subclass를 만들 수 없기 대문에, Subclass 생성을 해야 하는 경우에는 사용할 수 없다.