사용툴 분석

피클(pkl)과 json의 차이.

필만이 2024. 10. 3. 13:37

배경

  • 메타 데이터를 저장하는 과정에서 어느 순간 GPT가 피클 저장방식을 권유했다.
  • 그래서 메타 데이터를 저장하는 과정에서 피클과 json 저장방식을 비교하고 차이점을 도출한다.

피클(Pickle) vs JSON 차이점 비교

특징 피클(Pickle) JSON
언어 지원 Python 전용 다수의 언어에서 사용 가능 (Python, JavaScript 등)
자료형 유지 Python 객체의 모든 자료형을 유지 기본 자료형만 지원 (str, int, list, dict 등)
커스텀 객체 지원 클래스 인스턴스, 함수 등 복잡한 객체도 직렬화 가능 지원하지 않음 (직접 처리 필요)
직렬화 속도 바이너리(b) 형태라 상대적으로 빠름 텍스트 형태라 상대적으로 느림
파일 크기 피클은 객체 구조 전체를 직렬화하므로 더 클 수 있음 텍스트 형식으로 상대적으로 작은 파일 크기
데이터 가독성 이진 데이터로 사람이 읽을 수 없음 사람이 읽을 수 있는 텍스트 형식
보안 신뢰할 수 없는 데이터는 위험 (피클링된 객체 실행) 텍스트 형식이므로 상대적으로 안전
다중 언어 간 호환성 Python 전용 JSON은 다양한 언어 간 데이터 교환에 적합

피클과 JSON을 이용한 저장/불러오기 코드 비교

피클(Pickle) 방식 코드

import pickle

# 데이터
data_with_types = {
    "name": "John Doe",
    "age": 30,
    "is_student": False,
    "height": 1.75,
    "courses": ["Math", "Science"],
    "grades": {"Math": "A", "Science": "B"}
}

# wb(바이너리 형태로) 피클 파일 저장
with open('data_with_types.pkl', 'wb') as f:
    pickle.dump(data_with_types, f)

# wb(바이너리 형태로) 피클 파일에서 불러오기
with open('data_with_types.pkl', 'rb') as f:
    loaded_data = pickle.load(f)

# 출력
print(loaded_data)

JSON 방식 코드

import json

# 데이터
data_with_types = {
    "name": "John Doe",
    "age": 30,
    "is_student": False,
    "height": 1.75,
    "courses": ["Math", "Science"],
    "grades": {"Math": "A", "Science": "B"}
}

# 텍스트 쓰기(w) JSON 파일로 저장
with open('data_with_types.json', 'w') as f:
    json.dump(data_with_types, f, indent=4)

# 텍스트 읽기(r) JSON 파일에서 불러오기
with open('data_with_types.json', 'r') as f:
    loaded_data = json.load(f)

# 출력
print(loaded_data)

주요 차이점 정리:

  1. 저장 방식: 피클은 이진(binary) 형식으로 데이터를 직렬화하고, JSON은 텍스트 형식으로 데이터를 직렬화합니다.

  2. 불러올 때 자료형: JSON은 Python의 기본 자료형(문자열, 숫자, 리스트, 딕셔너리 등)만 복원, 피클은 여기에 더해서 함수를 포함해 Python 객체의 모든 자료형을 그대로 복원

    complex_structure = {"person": Person("Bob", 25), "data": {1, 2, 3}, "func": my_function}
  3. 호환성: 피클은 Python 전용이므로 다른 언어에서 읽을 수 없으나, JSON은 다수의 언어에서 사용 가능해 데이터 교환에 적합합니다.