Casos de uso comuns para pickle em Python

134

Examinei a documentação do pickle , mas não entendo onde o pickle é útil.

Quais são alguns casos de uso comuns para pickle?

satoru
fonte
2
A parte que eu não entendo sobre decapagem é por que você simplesmente não salva o valor em um arquivo? Por que conservá-lo?
Whackamadoodle3000

Respostas:

59

Alguns usos que encontrei:

1) salvar os dados de estado de um programa no disco para que ele possa continuar de onde parou quando reiniciado (persistência)

2) enviando dados python por uma conexão TCP em um sistema distribuído ou com vários núcleos (empacotamento)

3) armazenando objetos python em um banco de dados

4) converter um objeto python arbitrário em uma string para que ele possa ser usado como uma chave de dicionário (por exemplo, para armazenamento em cache e memorização).

Há alguns problemas com o último - dois objetos idênticos podem ser decapados e resultar em cadeias diferentes - ou mesmo o mesmo objeto decapado duas vezes pode ter representações diferentes. Isso ocorre porque o pickle pode incluir informações de contagem de referência.

Para enfatizar o comentário do @ lunaryorn - você nunca deve retirar uma string de uma fonte não confiável, pois um pickle cuidadosamente criado pode executar código arbitrário no seu sistema. Por exemplo, consulte https://blog.nelhage.com/2011/03/exploiting-pickle/

Dave Kirby
fonte
27
Não se deve transferir objetos em conserva pela rede ou outros canais não confiáveis, a menos que os dados armazenados sejam cuidadosamente protegidos contra manipulação. A documentação do pickle alerta explicitamente para nunca remover dados de fontes não confiáveis ​​ou não autenticadas.
lunaryorn
4
@ lunaryorn: bom ponto. Se você deseja transferir dados em vinagre entre máquinas, use um canal seguro, como o encapsulamento SSL ou SSH.
Dave Kirby
3
Então você ainda confia no ponto de extremidade para não explorá-lo, o que pode ou não ser bom, dependendo do contexto.
L̳o̳̳n̳̳g̳̳p̳o̳̳k̳̳e̳̳
@ lunaryorn - bom ponto, mas nesse caso, como podemos criptografar dados em domínio público. nós temos que usar algum outro lib py ou não usar pickle
Pardeep Sharma
O ponto 4) é verdadeiro? Achei isso com algumas evidências (antigas) que não funcionariam aqui .
salotz
10

Exemplo mínimo de ida e volta.

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

Edit: mas, quanto à questão dos exemplos reais de decapagem, talvez o uso mais avançado de decapagem (você precise cavar fundo na fonte) seja o ZODB: http://svn.zope.org/

Caso contrário, o PyPI menciona vários: http://pypi.python.org/pypi?:action=search&term=pickle&submit=search

Eu pessoalmente vi vários exemplos de objetos em conserva sendo enviados pela rede como um protocolo de transferência de rede fácil de usar.

Jacob Oscarson
fonte
8

A decapagem é absolutamente necessária para a computação distribuída e paralela.

Digamos que você queira fazer uma redução de mapa paralela com multiprocessing(ou entre nós de cluster com pyina ), então você precisa garantir que a função que você deseja mapear nos recursos paralelos decapará. Se não funcionar, você não poderá enviá-lo para outros recursos em outro processo, computador etc. Veja também aqui um bom exemplo.

Para fazer isso, eu uso o dill , que pode serializar quase tudo em python. O Dill também possui algumas boas ferramentas para ajudá-lo a entender o que está causando a falha da sua decapagem quando seu código falha.

E, sim, as pessoas usam o picking para salvar o estado de um cálculo, ou sua sessão ipython , ou o que seja.

Mike McKerns
fonte
7

Eu usei em um dos meus projetos. Se o aplicativo foi encerrado durante o trabalho (ele executou uma tarefa longa e processou muitos dados), eu precisava salvar toda a estrutura de dados e recarregá-la depois que o aplicativo fosse executado novamente. Eu usei o cPickle para isso, pois a velocidade era uma coisa crucial e o tamanho dos dados era realmente grande.

taskinoor
fonte
4

Pickle é como "Salvar como .." e "Abrir .." para suas estruturas e classes de dados. Digamos que eu queira salvar minhas estruturas de dados para que sejam persistentes entre as execuções do programa.

Salvando:

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

Carregando:

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

Agora eu não tenho que construir o meuStuff do zero mais uma vez, e posso simplesmente pegar o arquivo de onde parei.

espartano
fonte
3

Para o iniciante (como é o meu caso), é realmente difícil entender por que usar pickle em primeiro lugar ao ler a documentação oficial . Talvez porque os documentos impliquem que você já conhece todo o propósito da serialização. Somente depois de ler a descrição geral da serialização eu entendi o motivo desse módulo e seus casos de uso comuns. Também explicações amplas da serialização, desconsiderando uma linguagem de programação específica, podem ajudar: https://stackoverflow.com/a/14482962/4383472 , O que é serialização? , https://stackoverflow.com/a/3984483/4383472

Ruim
fonte
sua "resposta" não é uma resposta, é mais um comentário. A pergunta do OP é "Quais são alguns casos de uso comuns para picles?". Você sente que respondeu a essa pergunta de alguma maneira?
Mike McKerns
3
bem, sinto que respondi à pergunta porque também tive dificuldades para entender os usos comuns de picles quando tentei ler sobre este módulo aqui , aqui e aqui . Porque, na maioria das vezes, eles começam a explicar o que pickle faz, assumindo que você conhece a motivação por trás de todo o conceito de serialização. Depois de ler um simples artigo wiki sobre serialização, compreendi a idéia geral e os "casos comuns". Talvez ajude alguém ...
Bad
e alguns desses casos comuns são ...? Se houver alguns que não estão listados aqui em outras respostas ... adicioná-los à sua resposta seria muito apropriado.
Mike McKerns 11/03/2015
2

Para adicionar um exemplo do mundo real: A ferramenta de documentação Sphinx para Python usa pickle para armazenar em cache documentos analisados ​​e referências cruzadas entre documentos, para acelerar as compilações subsequentes da documentação.

lunaryorn
fonte
1

Posso dizer-lhe os usos para os quais uso e já o vi usados ​​para:

  • O perfil do jogo salva
  • Os dados do jogo salvam vidas e saúde
  • Registros anteriores dos números digitados inseridos em um programa

Esses são os que eu uso por pelo menos

Austin Gummy
fonte
1

Eu uso decapagem durante a demolição da Web em um site da Web naquele momento. Desejo armazenar mais de 8000k URLs e processá-los o mais rápido possível, para usar decapagem porque sua qualidade de saída é muito alta.

você pode acessar facilmente o URL e onde parar até a palavra-chave do diretório de tarefas também buscará os detalhes do URL muito rapidamente para retomar o processo.

Divanshu Tak
fonte