Examinei a documentação do pickle , mas não entendo onde o pickle é útil.
Quais são alguns casos de uso comuns para pickle?
Examinei a documentação do pickle , mas não entendo onde o pickle é útil.
Quais são alguns casos de uso comuns para pickle?
Respostas:
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/
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.
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.
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.
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.
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
Posso dizer-lhe os usos para os quais uso e já o vi usados para:
Esses são os que eu uso por pelo menos
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.