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

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

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

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

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



답변

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

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

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은 여기 에 절임에 대한 멋진 소개를 제공 합니다 .


답변

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

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

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

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


답변

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

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

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


답변

일종의 직렬화입니다. 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)


답변