pickle | Docs
피클(pkl) 파일은 파이썬이 기본적으로 지원하는 객체 저장 모듈이다.
파이썬에서 사용하는 모든 객체를 저장할 수 있으며, 인공지능 분야에서는 주로 가중치 등의 파라미터 값이나 학습시킨 모델을 저장할 때 사용한다.
The pickle module implements binary protocols for serializing and de-serializing a Python object structure. “Pickling” is the process whereby a Python object hierarchy is converted into a byte stream, and “unpickling” is the inverse operation, whereby a byte stream (from a binary file or bytes-like object) is converted back into an object hierarchy.
볼드체 표시한 부분을 보면 피클은 파이썬 객체 구조를 바이트 스트림으로 변환하는 바이너리 프로토콜을 제공한다고 적혀 있다.
자세한 작동 메커니즘은 공식 도큐를 뜯어보면 되고, 아래 예시와 같이 dump
, load
함수를 사용하여 save & load를 할 수 있다는 점만 기억해두자.
a = [1,2,3]
# pkl 저장
with open('test.pkl', 'wb') as f:
pickle.dump(a, f)
# pkl 불러오기
with open('test.pkl', 'rb') as f:
b = pickle.load(f)
print(b)
>>> [1, 2, 3]
pandas 같은 일부 프레임워크는 클래스 단위에서 피클 저장 옵션을 제공하는 경우가 있다.
import pickle
import pandas as pd
df = pd.DataFrame([[1, 2, 3],
[4, 5, 6]])
print(df)
>>> 0 1 2
0 1 2 3
1 4 5 6
# save
df.to_pickle('test2.pkl')
# load
df2 = pd.read_pickle('test2.pkl')
print(df2)
>>> 0 1 2
0 1 2 3
1 4 5 6
파일명에 확장자는 붙이지 않아도 되지만 명시해주는 게 좋다.
판다스를 사용하다 보면 데이터프레임을 .csv
파일로 저장할 때가 있는데 혼자 쓸 거라면 .pkl
포맷을 쓰는 게 더 빠르고 데이터 타입도 그대로 유지된다는 장점이 있다.
대신 타인에게 pkl 파일을 전달할 때는 피클 버전을 확인해야 한다. 피클 버전이 다르면 파일을 못 읽기 때문이다. 가능하면 타인에게 파일을 전송해야 할 경우 다른 포맷을 사용하자.