파이썬에서 피클의 일반적인 사용 사례


134

피클 문서를 살펴 보았지만 피클이 어디에 유용한 지 이해하지 못했습니다.

피클의 일반적인 사용 사례는 무엇입니까?


2
피클 링에 대해 얻지 못하는 부분은 파일에 값을 저장하지 않는 이유입니다. 왜 피클?
whackamadoodle3000

답변:


59

내가 본 몇 가지 용도 :

1) 프로그램의 상태 데이터를 디스크에 저장하여 다시 시작할 때 중단 된 부분을 유지할 수 있습니다 (지속성)

2) 멀티 코어 또는 분산 시스템에서 TCP 연결을 통해 파이썬 데이터 전송 (마샬링)

3) 파이썬 객체를 데이터베이스에 저장

4) 임의의 파이썬 객체를 문자열로 변환하여 사전 키로 사용할 수 있습니다 (예 : 캐싱 및 메모).

마지막 개체에는 몇 가지 문제가 있습니다. 두 개의 동일한 객체를 선택하여 다른 문자열을 만들 수도 있습니다. 피클에 참조 카운트 정보가 포함될 수 있기 때문입니다.

@lunaryorn의 의견을 강조하려면 신중하게 조작 된 피클이 시스템에서 임의의 코드를 실행할 수 있으므로 신뢰할 수없는 소스에서 문자열을 피클 링해서는 안됩니다. 예를 들어 https://blog.nelhage.com/2011/03/exploiting-pickle/을 참조 하십시오.


27
피클 링 된 데이터가 조작에 대해 신중하게 보호되지 않는 한 피클 링 된 객체를 네트워크 또는 기타 신뢰할 수없는 채널을 통해 전송해서는 안됩니다. 피클 문서 는 신뢰할 수 없거나 인증되지 않은 소스에서 데이터를 피클 링 하지 않도록 명시 적으로 경고 합니다.
lunaryorn

4
@lunaryorn : 좋은 지적입니다. 시스템간에 피클 링 된 데이터를 전송하려는 경우 SSL 또는 SSH 터널링과 같은 보안 채널을 사용하십시오.
Dave Kirby

3
그런 다음 컨텍스트에 따라 악용되지 않도록 엔드 포인트를 여전히 신뢰하고 있습니다.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

@lunaryorn-좋은 지적이지만이 경우 퍼블릭 도메인에서 데이터를 어떻게 암호화 할 수 있습니까? 다른 py lib를 사용하거나 pickle을 사용하지 않아야
합니까

포인트 4)가 맞습니까? 나는 여기서 작동하지 않을 몇 가지 (오래된) 증거가있는 것을 발견했습니다 .
살 로츠

10

최소 왕복 예 ..

>>> import pickle
>>> a = Anon()
>>> a.foo = 'bar'
>>> pickled = pickle.dumps(a)
>>> unpickled = pickle.loads(pickled)
>>> unpickled.foo
'bar'

편집 : 그러나 산세의 실제 예에 대한 질문에 관해서는 아마도 산세 가장 고급 사용 ( 아마도 소스를 깊이 파고 들어야 할 것입니다)은 ZODB입니다 : http://svn.zope.org/

그렇지 않으면 PyPI가 몇 가지를 언급합니다. http://pypi.python.org/pypi?:action=search&term=pickle&submit=search

나는 개인적으로 사용하기 쉬운 네트워크 전송 프로토콜로 네트워크를 통해 절인 객체가 전송되는 몇 가지 예를 보았습니다.


8

분산 및 병렬 컴퓨팅에는 산세가 반드시 필요합니다.

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

이를 위해 파이썬에서 거의 모든 것을 직렬화 할 수있는 dill을 사용 합니다. 딜에는 좋은 도구도 있습니다 당신은 당신의 코드가 실패 할 경우 실패 할 당신의 산세 원인을 이해하고 돕는합니다.

그리고, 사람들은 선택을 사용하여 계산 상태, ipython 세션 등 을 저장합니다 .


7

내 프로젝트 중 하나에서 사용했습니다. 앱이 작동하는 동안 종료 된 경우 (긴 작업을 수행하고 많은 양의 데이터를 처리) 전체 데이터 구조를 저장하고 앱이 다시 실행 된 후 다시로드해야했습니다. 속도가 중요하고 데이터 크기가 실제로 크기 때문에 cPickle을 사용했습니다.


4

Pickle은 데이터 구조 및 클래스의 "다른 이름으로 저장 .."및 "열기 .."와 같습니다. 프로그램 실행간에 지속되도록 데이터 구조를 저장하려고한다고 가정하겠습니다.

절약:

with open("save.p", "wb") as f:    
    pickle.dump(myStuff, f)        

로딩 :

try:
    with open("save.p", "rb") as f:
        myStuff = pickle.load(f)
except:
    myStuff = defaultdict(dict)

이제 처음부터 myStuff를 처음부터 다시 구축 할 필요가 없으며, 내가 중단 한 곳에서 픽업 할 수 있습니다.


3

초보자에게는 (나와 마찬가지로) 공식 문서를 읽을 때 왜 피클을 처음 사용하는지 이해하기가 어렵습니다 . 문서가 직렬화의 전체 목적을 이미 알고 있음을 암시하기 때문일 수 있습니다. 직렬화에 대한 일반적인 설명 을 읽은 후에 만이 모듈과 그 일반적인 사용 사례의 이유를 이해했습니다. 특정 프로그래밍 언어를 무시하고 직렬화에 대한 광범위한 설명은 도움이 될 수 있습니다. https://stackoverflow.com/a/14482962/4383472 , 직렬화 란 무엇입니까? , https://stackoverflow.com/a/3984483/4383472


귀하의 "답변"은 답변이 아니며 더 많은 의견입니다. OP의 질문은 "피클의 일반적인 사용 사례는 무엇입니까?"입니다. 어떤 식 으로든 그 질문에 답했다고 생각하십니까?
Mike McKerns 1

3
글쎄, 나는 여기 , 여기여기 에서이 모듈에 대해 읽으려고 할 때 피클의 일반적인 용도를 이해하는 데 어려움이 있었기 때문에 질문에 대답했다고 생각합니다 . 왜냐하면 대부분 직렬화 개념의 동기를 알고 있다고 가정 할 때 피클의 기능을 설명하기 시작하기 때문입니다. 직렬화에 대한 간단한 위키 기사를 읽은 후 "일반적인 사례"뿐만 아니라 일반적인 아이디어를 파악했습니다. 어쩌면 그것은 누군가를 도울 것입니다 ...
Bad

그 일반적인 사례 중 일부는 ...? 다른 답변에 여기에 나열되지 않은 내용이 있으면 답변에 추가하는 것이 매우 적합합니다.
Mike McKerns

2

실제 예제를 추가하려면 : Python 용 Sphinx 문서 도구는 피클을 사용하여 구문 분석 된 문서와 문서 간 상호 참조를 캐시하여 문서의 후속 빌드 속도를 높입니다.


1

내가 사용하는 용도를 알려주고 용도가 무엇인지 알 수 있습니다.

  • 게임 프로필 저장
  • 생명과 건강 같은 게임 데이터 저장
  • 프로그램에 입력 된 말 번호의 이전 레코드

그것들은 내가 적어도 그것을 사용하는 것입니다


1

나는 웹 사이트 중 하나를 웹 스크랩하는 동안 산세를 사용하고 8000k 개 이상의 URL을 저장하고 가능한 한 빨리 처리하고 싶습니다. 그래서 출력 품질이 매우 높기 때문에 산세를 사용합니다.

URL에 쉽게 접근 할 수 있으며 작업 디렉토리 키워드조차도 프로세스를 다시 시작하기 위해 URL 세부 정보를 매우 빠르게 가져올 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.