python 직렬화/역직렬화

spring·2024년 7월 31일
0

1. pickle

읽기 속도: pickle > gzip > xz > bz2 > json
압축률 : xz > bz2 > gzip > pkl > json

그냥 pickle 사용

import pickle
# 쓰기: filename에 data를 직렬화 하여 저장하기
try:
    with open(filename, "wb") as f:
        pickle.dump(data, f, pickle.HIGHEST_PROTOCOL)
except Exception as e:
    if os.path.exists(filename):
        os.remove(filename)
# 읽기: filename의 data를 역직렬화 하여 가져오기 (pickle.load는 CPU I/O bound 라 멀티스레딩 불가능)    
with open(filename, 'rb') as f:
    data = pickle.load(f)

gzip과 함께 사용

import pickle
import gzip
# 쓰기: filename에 data를 gzip으로 압축하여 직렬화 하여 저장하기
try:
    with gzip.open(filename, 'wb') as f:
        pickle.dump(data, f)
except Exception as e:
    if os.path.exists(filename):
        os.remove(filename)
# 읽기: filename의 data를 gzip으로 열어 역직렬화 하여 가져오기 
with gzip.open(filename, 'rb') as f:
    data = pickle.load(f)

bz2와 함께 사용

import pickle
import bz2
# 쓰기: filename에 data를 bz2으로 압축하여 직렬화 하여 저장하기
try:
    with bz2.open(filename, 'wb') as f:
        pickle.dump(data, f)
except Exception as e:
    if os.path.exists(filename):
        os.remove(filename)
# 읽기: filename의 data를 bz2으로 열어 역직렬화 하여 가져오기         
with bz2.open(filename, 'rb') as f:
   data = pickle.load(f)

lzma와 함께 사용(xz)

import pickle
import lzma
# 쓰기: filename에 data를 lzma(xz)으로 압축하여 직렬화 하여 저장하기
try:
    with lzma.open(filename, 'wb') as f:
        pickle.dump(data, f)
except Exception as e:
    if os.path.exists(filename):
        os.remove(filename)
# 읽기: filename의 data를 lzma(xz)으로 열어 역직렬화 하여 가져오기  
with lzma.open(filename, 'rb') as f:
    data = pickle.load(f)

zipfile과 함께 사용(zip)

import pickle
import zipfile
# 쓰기: filename에 data를 zipfile로 압축하여 직렬화 하여 저장하기
filename = "/Users/user/PycharmProjects/samples/test/dummy.zip"
basename = os.path.splitext(os.path.basename(filename))[0] + ".pkl"
try:
    with zipfile.ZipFile(filename, 'w', zipfile.ZIP_DEFLATED) as zf:
        zf.writestr(basename, pickle.dumps(data))
except Exception as e:
    print(e)
    if os.path.exists(filename):
        os.remove(filename)
# 읽기: filename의 data를 zipfile로 열어 역직렬화 하여 가져오기 
with zipfile.ZipFile(filename, 'r') as zf:
    with zf.open(basename) as file:
        data = pickle.load(file)

zstandard

def save_compressed_pickle(data, filepath):
    import pickle
    import zstandard as zstd
    import os
    cctx = zstd.ZstdCompressor(level=22, threads=os.cpu_count() * 2)

    with open(filepath, 'wb') as f:
        compressed_data = cctx.compress(pickle.dumps(data, pickle.HIGHEST_PROTOCOL))
        f.write(compressed_data)

정리 예정

import cbor2  # pip install cbor2

with open("dummy.cbor2", "wb") as f:
    f.write(cbor2.dumps(data))

with open("dummy.cbor2", "rb") as f:
    data2 = cbor2.loads(f.read())
print(data2)
msgpack
ujson
cbor2
sqlite3
profile
Researcher & Developer @ NAVER Corp | Designer @ HONGIK Univ.

0개의 댓글