[Pandas] ํ๋ค์ค ํผํด(.pkl) ํ์ผ์ ์์ถ ๋ฐฉ์ ๋น๊ต
์๋ณธ ๊ฒ์๊ธ: https://velog.io/@euisuk-chung/Pandas-pickleํ์ผ์-์์ถ-๋ฐฉ์-๋น๊ต-๋ฐ-ํ์ฉ-๊ฐ์ด๋
Pandas์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ
ํ๊ณ ๋ก๋
ํ๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ก .pkl
(pickle) ํ์ผ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Pickle ํ์ผ์ Python ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ(serialize)
ํ์ฌ ์ ์ฅํ๋ ๋ฐฉ์์ผ๋ก, ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ด๋๋ฆฌ ํ์์ผ๋ก ๋ณํํ์ฌ ํจ์จ์ ์ผ๋ก ์ ์ฅํ ์ ์์ต๋๋ค.
(์ฐธ๊ณ ) โ๋ฐ์ดํฐ ์ง๋ ฌํโ๋ ๋ฐ์ดํฐ๋ฅผ
์ ์ฅ ๋งค์ฒด์ ์ ์ฅํ ์ ์๋ ํ์
๋๋๋คํธ์ํฌ๋ฅผ ํตํด ์ ์กํ ์ ์๋ ํ์
์ผ๋ก ๋ณํํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
- Pickle ํ์ผ์ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐํ๋ ์์ ๊ตฌ์กฐ๋ฅผ ๊ทธ๋๋ก ์ ์งํ๋ฉด์๋ ๋น๊ต์ ๋น ๋ฅด๊ฒ ์ ์ฅ ๋ฐ ๋ก๋ํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
Pandas ํผํด ํ์ผ์ด๋?
Pandas์ to_pickle()
๋ฐ read_pickle()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐํ๋ ์์ ์์ฝ๊ฒ ์ ์ฅํ๊ณ ๋ค์ ๋ถ๋ฌ์ฌ ์ ์์ต๋๋ค.
-
Pickle ํ์ผ์ CSV๋ JSON๊ณผ ๊ฐ์ ํ ์คํธ ๊ธฐ๋ฐ ํ์ผ ํ์๊ณผ ๋ฌ๋ฆฌ, ๋ฐ์ดํฐ์ ๊ตฌ์กฐ์ ํ์์ ๊ทธ๋๋ก ์ ์งํ๋ฉด์๋ ๋ณด๋ค ๋น ๋ฅด๊ณ ์ฝ๊ฒ ์ ์ฅํ ์ ์์ต๋๋ค.
- ์ผ๋ฐ์ ์ผ๋ก, Pickle ํ์ผ์ ๋ฐ์ดํฐ ์ ์ฅ ์๋์ ์ฝ๊ธฐ ์๋๊ฐ ๋น ๋ฅด๋ฉฐ, Pandas์์ ์ง์ํ๋ ๋ค์ํ ๊ฐ์ฒด๋ฅผ ์์ฝ๊ฒ ์ ์ฅํ ์ ์์ต๋๋ค.
- ๊ทธ๋ฌ๋ Pickle ํ์ผ์ Python์์๋ง ์ฌ์ฉํ ์ ์๋ ํ์์ด๋ฏ๋ก ๋ค๋ฅธ ์ธ์ด์์ ํธํ์ฑ์ด ๋ฎ์ ๋จ์ ์ด ์์ต๋๋ค.
๐ก (์ฐธ๊ณ )
ํผํด(Pickle)
ํ์ผ๊ณผํ์ผ์ด(Parquet)
ํ์ผ์ ์ ์ฅ ๋ฐ ๋ก๋ ์๋๋ ๋ฐ์ดํฐ์ ํน์ฑ, ํ์ผ ํฌ๊ธฐ, ์์คํ ํ๊ฒฝ ๋ฑ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ต๋๋ค.
- ์ผ๋ถ ๋ฌธํ์์๋ ํ์ผ์ด ํ์์ด ํผํด๋ณด๋ค ๋ ๋น ๋ฅธ ์ฑ๋ฅ์ ๋ณด์ธ๋ค๊ณ ํ์ง๋ง, ์ด๋ ๋ฐ์ดํฐ์ ๊ตฌ์กฐ์ ๋ด์ฉ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค.
- ํผํด์ ๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ์งํ๋ ๋ฐ ๊ฐ์ ์ด ์์ง๋ง, ๋๋์ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ๋๋ Parquet ํ์์ด ๋ ์ ํฉํ ์ ์์ต๋๋ค.
- ์ค์ ๋ก Pycon2023์์ ๋๋์ ๋ฐ์ดํฐ์ ๋ํด์๋ Parquet์ด ๋ ํจ์จ์ ์ด์๋ค๋ ๋ฐํ๋ ์์์ต๋๋ค. (๋งํฌ)
๋๋์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๊ฒฝ์ฐ ํผํด ํ์ผ์ ํฌ๊ธฐ๊ฐ ์ปค์ง ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ์ค์ด๊ธฐ ์ํด ์์ถ
์ ์ ์ฉํ ์ ์์ต๋๋ค.
- Pandas๋ ๋ค์ํ ์์ถ ๋ฐฉ์์ ์ง์ํ๋ฉฐ, ๊ฐ๊ฐ์ ํน์ง๊ณผ ์ฌ์ฉ๋ฒ์ด ๋ค๋ฆ ๋๋ค.
์ด๋ฒ ๊ธ์์๋ Pandas์ ํผํด ํ์ผ์์ ์ฌ์ฉํ ์ ์๋ ์ฃผ์ ์์ถ ๋ฐฉ์(gzip
, bz2
, zip
, xz
)์ ํน์ง๊ณผ ์ฐจ์ด์ ์ ์ ๋ฆฌํ๊ณ , ์ธ์ ์ด๋ค ๋ฐฉ์์ ์ ํํ๋ ๊ฒ์ด ํจ๊ป ์ดํด๋ณด๊ณ ์ ํฉ๋๋ค.
๐ Pandas Documentation ๊ธฐ์ค ์๋ ๋ด์ฉ์ ๋๋ค:
- https://pandas.pydata.org/docs/user_guide/io.html#pickling ์ค Compressed pickle files
์ Documention์์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ฅ์ผ๋ก ๊ฐ๋ตํ๊ฒ ์์ ํ์ง๋ง,
โ
read_pickle()
,DataFrame.to_pickle()
andSeries.to_pickle()
can read and write compressed pickle files. The compression types ofgzip
,bz2
,xz
,zstd
are supported for reading and writing. The zip file format only supports reading and must contain only one data file to be read.โ- ๋ณธ ๊ฒ์๊ธ์์๋ ์ด๋ฅผ ์ข ๋ ๋ฉด๋ฐํ๊ฒ ํํค์ณ๋ณด๊ณ ์ ํ์์ต๋๋ค.
-
์ฃผ์ ์์ถ ๋ฐฉ์ ๋น๊ต
์ฃผ์ ์์ถ ๊ธฐ๋ฒ๋ค(gzip
, bz2
, xz
, zstd
)์ ํน์ง์ ์ ๋ฆฌํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ ๋ฆฌํด๋ณผ ์ ์์ต๋๋ค.
์์ถ ๋ฐฉ์ | ์์ถ๋ฅ | ์์ถ ์๋ | ํด์ ์๋ | ์ฌ์ฉ ์ฉ๋ | ํน์ง |
---|---|---|---|---|---|
gzip | ์ค๊ฐ | ๋น ๋ฆ | ๋น ๋ฆ | ์ผ๋ฐ์ ์ธ ๋ฐ์ดํฐ ์์ถ | ๋ง์ ์์คํ ์์ ๊ธฐ๋ณธ ์ง์ |
bz2 | ๋์ | ๋๋ฆผ | ๋๋ฆผ | ๋์ ์์ถ๋ฅ ์ด ํ์ํ ๋ | CPU ์ฌ์ฉ๋์ด ๋์ |
zip | ์ค๊ฐ~๋ฎ์ | ๋น ๋ฆ | ๋น ๋ฆ | ๋ค์ํ ํ์ผ์ ๋ฌถ์ ๋ | ์๋์ฐ ํ๊ฒฝ์์ ๋๋ฆฌ ์ฌ์ฉ |
xz | ๋งค์ฐ ๋์ | ๋งค์ฐ ๋๋ฆผ | ๋๋ฆผ | ์ฅ๊ธฐ ๋ณด๊ด์ฉ ๋ฐฑ์ | ์์ถ ํด์ ๊ฐ ๋๋ฆด ์ ์์ |
๊ฐ๊ฐ์ ๊ธฐ๋ฒ๋ค์ ๋ํด์ ์ข ๋ ์์ธํ๊ฒ ๋ค์ฌ๋ค ๋ณผ๊น์? ๐
-
๊ฐ ์์ถ ๋ฐฉ์์ ํน์ง ๋ฐ ์ฌ์ฉ ์์
(1) gzip
-
ํน์ง:
- ์์ถ ๋ฐ ํด์ ์๋๊ฐ ๋น ๋ฅด๋ฉฐ, ๋คํธ์ํฌ ์ ์ก ์์๋ ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค.
-
์ ํฉํ ์ํฉ:
- ๋น ๋ฅธ ๋ฐ์ดํฐ ์ ์ฅ ๋ฐ ๋ก๋ฉ์ด ํ์ํ ๊ฒฝ์ฐ
- ํ์ผ ํฌ๊ธฐ๋ณด๋ค๋ ์๋๊ฐ ์ค์ํ ๊ฒฝ์ฐ
์์ ์ฝ๋:
1
2
3
4
5
6
7
8
9
import pandas as pd
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
# gzip ์์ถ์ ์ ์ฉํ์ฌ ํผํด ์ ์ฅ
df.to_pickle('data.pkl.gz', compression='gzip')
# ์ ์ฅ๋ ํผํด ํ์ผ์ ์ฝ๊ธฐ
df_loaded = pd.read_pickle('data.pkl.gz', compression='gzip')
(2) bz2
-
ํน์ง:
- ๋์ ์์ถ๋ฅ ์ ์ ๊ณตํ์ง๋ง, ์์ถ ๋ฐ ํด์ ์๋๊ฐ ๋๋ฆฝ๋๋ค.
-
์ ํฉํ ์ํฉ:
- ์ ์ฅ ๊ณต๊ฐ ์ ์ฝ์ด ์ค์ํ ๊ฒฝ์ฐ
- ์์ถ/ํด์ ์๋๊ฐ ๋๋ ค๋ ๊ด์ฐฎ์ ๊ฒฝ์ฐ
์์ ์ฝ๋:
1
2
3
4
# bz2 ์์ถ ์ ์ฉ
df.to_pickle('data.pkl.bz2', compression='bz2')
df_loaded = pd.read_pickle('data.pkl.bz2', compression='bz2')
(3) zip
-
ํน์ง:
- ์ฌ๋ฌ ํ์ผ์ ํ๋๋ก ๋ฌถ์ ์ ์์ผ๋ฉฐ, ๋ค์ํ ์ด์์ฒด์ ์์ ๋๋ฆฌ ์ง์๋ฉ๋๋ค.
-
์ ํฉํ ์ํฉ:
- ์ฌ๋ฌ ๊ฐ์ ํ์ผ์ ํ๋์ ์์ถ ํ์ผ๋ก ์ ์ฅํด์ผ ํ๋ ๊ฒฝ์ฐ
- ํธํ์ฑ์ด ์ค์ํ ๊ฒฝ์ฐ (ํนํ Windows ํ๊ฒฝ)
์์ ์ฝ๋:
1
2
3
4
# zip ์์ถ ์ ์ฉ
df.to_pickle('data.pkl.zip', compression='zip')
df_loaded = pd.read_pickle('data.pkl.zip', compression='zip')
(4) xz
-
ํน์ง:
- ๋งค์ฐ ๋์ ์์ถ๋ฅ ์ ์ ๊ณตํ์ง๋ง, ์์ถ ๋ฐ ํด์ ์๋๊ฐ ๋งค์ฐ ๋๋ฆฝ๋๋ค.
-
์ ํฉํ ์ํฉ:
- ์ฅ๊ธฐ ๋ณด๊ด์ฉ ๋ฐ์ดํฐ ์์ถ
- ์ ์ฅ ๊ณต๊ฐ์ ์ต๋ํ ์ ์ฝํด์ผ ํ๋ ๊ฒฝ์ฐ
์์ ์ฝ๋:
1
2
3
4
# xz ์์ถ ์ ์ฉ
df.to_pickle('data.pkl.xz', compression='xz')
df_loaded = pd.read_pickle('data.pkl.xz', compression='xz')
-
์ธ์ ์ด๋ค ์์ถ ๋ฐฉ์์ ์ ํํด์ผ ํ ๊น?
๊ฐ ๋ฐฉ์์ ํน์ง์ ์ข ํฉํ์ฌ, ์ํฉ๋ณ ์ ํฉํ ์์ถ ๋ฐฉ์์ ์ ๋ฆฌํด๋ณด์์ต๋๋ค.
์ํฉ | ์ถ์ฒ ์์ถ ๋ฐฉ์ | ์ด์ |
---|---|---|
์๋๊ฐ ๊ฐ์ฅ ์ค์ํ ๊ฒฝ์ฐ | gzip |
๋น ๋ฅธ ์์ถ ๋ฐ ํด์ |
์ต๋ ์์ถ๋ฅ ์ด ํ์ํ ๊ฒฝ์ฐ | xz |
๋งค์ฐ ๋์ ์์ถ๋ฅ ์ ๊ณต |
์๋๋ณด๋ค ์์ถ๋ฅ ์ด ์ค์ํ ๊ฒฝ์ฐ | bz2 |
gzip๋ณด๋ค ๋์ ์์ถ๋ฅ ์ ๊ณต |
์ฌ๋ฌ ๊ฐ์ ํ์ผ์ ๋ฌถ์ ๋ | zip |
ํธํ์ฑ์ด ์ข๊ณ ์ฌ๋ฌ ํ์ผ์ ์์ถ ๊ฐ๋ฅ |
-
๊ฒฐ๋ก
Pandas์์ ํผํด ํ์ผ์ ์ ์ฅํ ๋ ์์ถ์ ์ ์ฉํ๋ฉด ํ์ผ ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ , ์ ์ก ๋ฐ ์ ์ฅ ๊ณต๊ฐ์ ์ ์ฝํ ์ ์์ต๋๋ค. ํ์ง๋ง ๊ฐ ์์ถ ๋ฐฉ์๋ง๋ค ์ฅ๋จ์ ์ด ์กด์ฌํ๋ฏ๋ก, ๋ฐ์ดํฐ์ ํน์ฑ๊ณผ ์ฌ์ฉ ๋ชฉ์ ์ ๋ง์ถฐ ์ ์ ํ ์์ถ ๊ธฐ๋ฒ์ ์ ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- gzip: ๋น ๋ฅธ ์์ถ ๋ฐ ํด์ ์๋๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ถ์ฒ
- bz2: ๋์ ์์ถ๋ฅ ์ ์ํ์ง๋ง ์๋๋ ์ค์ํ์ง ์์ ๊ฒฝ์ฐ
- zip: ์ฌ๋ฌ ๊ฐ์ ํ์ผ์ ๋ฌถ์ด ์ ์ฅํ๊ฑฐ๋, Windows ํ๊ฒฝ์์ ํธํ์ฑ์ ๊ณ ๋ คํ ๋
- xz: ์ต๋ํ ๋์ ์์ถ๋ฅ ์ด ํ์ํ์ง๋ง ์๋๊ฐ ๋๋ ค๋ ๊ด์ฐฎ์ ๋
๊ฐ์ธ์ ์ผ๋ก ์
๋ฌด์์๋ ์ฃผ๋ก gzip
์ ํ์ฉํ์ง๋ง, ์ด๋ฒ ๊ธ์ ํตํด ๋ค์ํ ์์ถ ๊ธฐ๋ฒ์ ํน์ฑ์ ์ ๋ฆฌํ๋ฉฐ ๋์์ ์ฐพ์๋ณด๊ณ ์ ํ์ต๋๋ค.
์ฌ๋ฌ๋ถ์ ์ด๋ค ์์ถ ๋ฐฉ์์ ์ฃผ๋ก ์ฌ์ฉํ์๋์? ๊ฐ์์ ๊ฒฝํ๊ณผ ํ์ฉ ์ฌ๋ก๋ฅผ ๊ณต์ ํด ์ฃผ์ธ์! ๐
์ค๋๋ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค ๐โโ๏ธ