파이썬 직렬화-왜 피클인가?


88

Python 피클 링은 txt 파일이나 DB로 작성된 출력과는 달리 개체 프로그래밍을 존중하는 방식으로 Python 개체를 '저장'하는 방법이라는 것을 이해했습니다.

다음 사항에 대한 자세한 내용이나 참고 자료가 있습니까?

  • 절인 물건은 어디에 '저장'됩니까?
  • 피클 링이 DB에 저장하는 것보다 객체 표현을 보존하는 이유는 무엇입니까?
  • 한 Python 셸 세션에서 다른 세션으로 피클 된 객체를 검색 할 수 있습니까?
  • 직렬화가 유용한 경우 중요한 예가 있습니까?
  • 피클을 사용한 직렬화는 데이터 '압축'을 의미합니까?

즉, 피클 링에 대한 문서를 찾고 있습니다. Python.doc은 피클을 구현하는 방법을 설명하지만 직렬화의 사용 및 필요성에 대한 자세한 내용은 설명하지 않습니다.


나중에 복원하기 위해 상태를 저장하거나 객체를 다른 파이썬 런타임에 공유 / 복사하는 것은 내 생각입니다.
synthesizerpatel

13
질문의 대부분은 직렬화에 위키 백과의 기사에 의해 응답됩니다 en.wikipedia.org/wiki/Serialization
NPE

5
Python에서 직렬화를 위해 왜 Pickle이 필요한지 묻고 있습니까? 또는 결국 직렬화의 목적은 무엇입니까? .
moooeeeep 2012 년

피클의 보안 문제를 언급하는 것이 좋습니다. 예제는 문서이와 같은 수많은 SO 질문에서 찾을 수 있습니다 .
djvg

답변:


99

피클 링은 파이썬 객체 (목록, 딕셔너리 등)를 문자 스트림으로 변환하는 방법입니다. 아이디어는이 문자 스트림이 다른 파이썬 스크립트에서 객체를 재구성하는 데 필요한 모든 정보를 포함한다는 것입니다.

절인 정보가 저장되는 위치는 일반적으로 다음과 같습니다.

with open('filename', 'wb') as f:
    var = {1 : 'a' , 2 : 'b'}
    pickle.dump(var, f)

그것은 var'filename'파일 에 우리 dict 의 절인 버전을 저장 합니다. 그런 다음 다른 스크립트에서이 파일에서 변수로로드하면 사전이 다시 생성됩니다.

with open('filename','rb') as f:
    var = pickle.load(f)

피클 링의 또 다른 용도는이 사전을 네트워크를 통해 전송해야하는 경우입니다 (아마도 소켓 또는 기타 사용). 먼저 문자 스트림으로 변환해야하는 경우 소켓 연결을 통해 전송할 수 있습니다.

또한 여기서 말하는 "압축"은 없습니다. 하나의 표현 (RAM)에서 다른 표현 ( "텍스트")으로 변환하는 방법 일뿐입니다.

About.com은 여기 에 절임에 대한 멋진 소개를 제공 합니다 .


2
보통 사람은 할 것with open('filename') as f: ...
moooeeeep

3
또한 with open(filename, 'wb') as f: ...파일에 쓸 수 없거나 그렇게해야 합니다.
Tim Pietzcker 2012 년

감사!! 파이썬 영속성 관리에 대한이 사람은 좋은이며, 여기
kiriloff

1
일반적으로 pickle네트워크를 통해 사전을 전송하는 데 사용하는 것은 좋은 생각이 아닙니다 (json이 여기에서 더 좋을 수 있음). 드물지만 유용 할 수 있습니다 (예 : multiprocessingmodule).
jfs

@Tim Pietzcker : protocol=0(Python2.x의 기본값)은 텍스트 모드로 열린 파일에 사용할 수 있습니다.
jfs

36

산세는 분산 및 병렬 컴퓨팅에 절대적으로 필요합니다.

병렬 맵 축소를 수행하고 싶다면 multiprocessing(또는 pyina를 사용 하여 클러스터 노드에서 ) 병렬 리소스에 매핑하려는 함수가 피클되는지 확인해야합니다. 피클하지 않으면 다른 프로세스, 컴퓨터 등의 다른 리소스로 보낼 수 없습니다 . 좋은 예는 여기 를 참조 하십시오 .

이를 위해 파이썬에서 거의 모든 것을 직렬화 할 수있는 dill을 사용 합니다. Dill은 또한 코드가 실패 할 때 피클 링이 실패하는 원인을 이해하는 데 도움 이되는 몇 가지 좋은 도구제공 합니다.

그리고 예, 사람들은 계산 상태 또는 ipython 세션 등 을 저장하기 위해 선택을 사용합니다 . 당신은 또한에 압축을 할 피클의 피클 러와 UnPickler을 확장 할 수 있습니다 bz2또는 gzip당신이 원하신다면.


0

크고 복잡한 사용자 정의 클래스에 특히 유용합니다. 특정 예에서 클래스를 만들기 위해 (데이터베이스에서) 정보를 "수집"하는 것은 이미 절반의 전투였습니다. 그런 다음 클래스에 저장된 정보는 런타임에 사용자가 변경할 수 있습니다.

데이터베이스에 다른 테이블 그룹을 갖고 저장된 모든 것을 살펴보고 새 데이터베이스 테이블에 기록하는 다른 함수를 작성할 수 있습니다. 그런 다음 모든 정보를 다시 읽어서 저장된 항목을로드 할 수있는 다른 함수를 작성해야합니다.

또는 전체 클래스를있는 그대로 피클 한 다음 데이터베이스의 단일 필드에 저장할 수 있습니다. 그런 다음 다시로드 할 때 이전과 마찬가지로 한 번에 모두로드됩니다. 이렇게하면 복잡한 클래스를 저장하고 검색 할 때 많은 시간과 코드를 절약 할 수 있습니다.


-1

일종의 직렬화입니다. cPickle을 사용하면 pickle보다 훨씬 빠릅니다.

import pickle
##make Pickle File
with open('pickles/corups.pickle', 'wb') as handle:
    pickle.dump(corpus, handle)

#read pickle file
with open('pickles/corups.pickle', 'rb') as handle:
    corpus = pickle.load(handle)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.