개발/Python

Python의 pickle에 대한 일반적인 사용 사례

MinorMan 2021. 4. 19. 04:56
반응형

<질문>

나는 보았다pickle문서이지만 피클이 유용한 곳을 이해하지 못합니다.

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


<답변1>

내가 본 몇 가지 용도 :

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

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

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

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

마지막 하나에는 몇 가지 문제가 있습니다. 두 개의 동일한 객체가 절인되어 다른 문자열이 생성 될 수 있습니다. 또는 두 번 절인 된 동일한 객체도 다른 표현을 가질 수 있습니다. 피클이 참조 횟수 정보를 포함 할 수 있기 때문입니다.

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


<답변2>

최소 왕복 예제 ..

>>> 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

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


<답변3>

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

병렬 맵 축소를 원한다고 가정 해 보겠습니다.multiprocessing(또는pyina) 그런 다음 병렬 리소스에 매핑하려는 함수가 피클되는지 확인해야합니다. 피클하지 않으면 다른 프로세스, 컴퓨터 등의 다른 리소스로 보낼 수 없습니다.here좋은 예입니다.

이렇게하려면dill, 파이썬에서 거의 모든 것을 직렬화 할 수 있습니다. 딜도some good tools코드가 실패 할 때 피클 링이 실패하는 원인을 이해하는 데 도움이됩니다.

그리고 예, 사람들은 선택을 사용하여 계산 상태를 저장하거나ipython세션 또는 무엇이든.


<답변4>

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


<답변5>

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


<답변6>

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를 처음부터 다시 만들 필요가 없으며 중단 한 부분부터 선택 (le) 할 수 있습니다.


<답변7>

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


<답변8>

내가 그것을 사용하는 용도를 말할 수 있으며 다음 용도로 사용되는 것을 볼 수 있습니다.

  • 게임 프로필 저장
  • 게임 데이터는 생명과 건강을 저장합니다
  • 프로그램에 입력 된 말 번호의 이전 기록

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


<답변9>

당시 웹 사이트 중 하나를 스크래핑 할 때 피클 링을 사용합니다. 8000k 이상의 URL을 저장하고 최대한 빨리 처리하고 싶어서 출력 품질이 매우 높기 때문에 피클 링을 사용합니다.

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

반응형