2010-08-09 6 views
98

Я просмотрел документацию pickle, но я не понимаю, где рассол полезен.Обычные прецеденты для рассола в Python

Каковы некоторые распространенные прецеденты для рассола?

+13

У меня есть что-то похожее на Google, но Google недостаточно умен, чтобы сказать мне, как может мне помочь определенный модуль. Я знаю, как использовать «pickle», но то, что я хочу знать, в том, что сценарий использует другие люди. – satoru

+39

В этом вопросе нет ничего плохого. – FogleBird

+20

Upvote. Такие вопросы очень важны для Stackoverflow. –

ответ

44

Некоторых видов использования, которые я встречал:

1) сохранение данных о состоянии программы, на диск, чтобы он мог продолжать, где она была прервана при перезапуске (настойчивость)

2) отправки питона данных по соединение TCP в многоядерном или распределенную система (сортировочный)

3) хранение объектов питона в базе данных

4) превращение произвольного объекта питона в строку, так что она может быть использована в качестве словаря ключа (например, для c ношение & memoization).

Есть некоторые проблемы с последним - два одинаковых объекта могут быть маринованными и привести к разным строкам - или даже один и тот же объект, маринованный дважды, может иметь разные представления. Это связано с тем, что рассол может включать в себя информацию счетчика ссылок.

+20

Нельзя передавать травленные объекты по сети или другим ненадежным каналам, если только маринованные данные не защищены от манипуляций. Документация pickle явно предупреждает * никогда не распаковывать данные из ненадежных или не прошедших проверку подлинности источников. – lunaryorn

+4

@лунариорн: хорошая точка. Если вы собираетесь передавать маринованные данные между машинами, используйте безопасный канал, например, SSL или SSH-туннелирование. –

+3

Тогда вы по-прежнему доверяете конечной точке не использовать вас, что может быть или не быть в порядке, в зависимости от контекста. –

9

Minimal туда и обратно пример ..

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

Edit: но на вопрос о реальных примерах травления, возможно, самых передовыми использования травления (вы должны копать достаточно глубоко в источник) является ZODB: http://svn.zope.org/

в противном случае, PyPI упоминает несколько: http://pypi.python.org/pypi?:action=search&term=pickle&submit=search

Я лично видел несколько примеров травильных объектов, отправляемых по сети в качестве простого в использовании протокола передачи сети.

5

Я использовал его в одном из своих проектов. Если приложение было прекращено во время его работы (оно выполняло длительную задачу и обрабатывало множество данных), мне нужно было сохранить всю структуру данных и перезагрузить ее после повторного запуска приложения. Я использовал cPickle для этого, так как скорость была важной вещью, а размер данных был действительно большим.

2

Чтобы добавить пример реального мира: Инструмент документации Sphinx для Python использует pickle для кэширования анализируемых документов и перекрестных ссылок между документами, чтобы ускорить последующие сборки документации.

5

Травление абсолютно необходимо для распределенных и параллельных вычислений.

Предположим, что вы хотите выполнить параллельное сокращение карты с помощью multiprocessing (или через узлы кластера с pyina), тогда вам нужно убедиться, что функция, которую вы хотите сопоставить через параллельные ресурсы, будет размножаться. Если он не маринован, вы не можете отправить его другим ресурсам на другой процесс, компьютер и т. Д. Также см. here для хорошего примера.

Для этого я использую dill, который может сериализовать почти что угодно в python. У Dill также есть some good tools, чтобы помочь вам понять, что приводит к сбою вашего травления, когда ваш код выходит из строя.

И, да, люди используют сбор, чтобы сохранить состояние расчета, или ваш сеанс ipython, или что-то еще.

3

Для новичка (как в случае со мной) очень сложно понять, почему использовать рассол в первую очередь при чтении official documentation. Возможно, потому, что документы подразумевают, что вы уже знаете всю цель сериализации. Только после прочтения сериализации general description я понял причину этого модуля и его общие варианты использования. Также широкие объяснения сериализации считаясь конкретным языком программирования могут помочь: https://stackoverflow.com/a/14482962/4383472, What is serialization?, https://stackoverflow.com/a/3984483/4383472

+0

ваш «ответ» - это не ответ, это скорее комментарий. Вопрос OP: «Каковы некоторые общие случаи использования рассола?». Считаете ли вы, что вы так или иначе ответили на этот вопрос? –

+1

Хорошо, я чувствую, что ответил на этот вопрос, потому что у меня также были трудности с пониманием общего использования рассола, когда я пытался прочитать об этом модуле [здесь] (https://docs.python.org/3.4/library/pickle. html), [здесь] (http://en.wikipedia.org/wiki/Pickle_ (Python)) и [здесь] (http://pymotw.com/2/pickle/index.html). Потому что в основном они начинают объяснять, что рассол предполагает, что вы знаете мотивацию всей концепции сериализации. После того, как я прочитал простую статью о сериализации, я понял общую идею, а также «общие случаи».Может быть, это поможет кому-то ... – Bad

+0

и некоторые из этих распространенных случаев ...? Если есть некоторые, которые не перечислены здесь в других ответах ... добавление их к вашему ответу было бы очень уместным. –

1

Я могу сказать вам пользы, я использую его для и видел это используется для:

  • игр профиль сохраняет
  • Данные игры сохраняются как жизни и здоровье
  • Предыдущие записи о числах, введенных в программу

Это те, которые я использую его по крайней мере

0

соленья походит «Сохранить как ..» и «Open ..» для ваших структур данных и классов. Предположим, я хочу сохранить свои структуры данных, чтобы они сохранялись между программами.

Экономия:

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 с нуля, и я могу просто выбрать (ле) от того, где я оставил выкл.

Смежные вопросы