Ответы:
Некоторые применения, с которыми я сталкивался:
1) сохранение данных о состоянии программы на диск, чтобы при перезапуске она могла продолжить работу с того места, на котором остановилась (постоянство)
2) отправка данных Python по TCP-соединению в многоядерной или распределенной системе (сортировка)
3) хранение объектов Python в базе данных
4) преобразование произвольного объекта python в строку, чтобы его можно было использовать в качестве ключа словаря (например, для кэширования и запоминания).
С последним есть некоторые проблемы - два одинаковых объекта могут быть выбраны и приводить к различным строкам - или даже один и тот же объект, подвергнутый двойному травлению, может иметь разные представления. Это связано с тем, что рассол может содержать информацию о количестве ссылок.
Чтобы подчеркнуть комментарий @ lunaryorn - вы никогда не должны извлекать строку из ненадежного источника, так как тщательно созданный рассол может выполнить произвольный код в вашей системе. Например, смотрите https://blog.nelhage.com/2011/03/exploiting-pickle/
Пример минимального туда-обратно ..
>>> 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
Я лично видел несколько примеров маринованных объектов, отправляемых по сети, как простой в использовании сетевой протокол передачи.
Травление абсолютно необходимо для распределенных и параллельных вычислений.
Скажем, вы хотите выполнить параллельное уменьшение карты с multiprocessing
(или через узлы кластера с помощью pyina ), затем вам нужно убедиться, что функция, которую вы хотите отобразить на параллельные ресурсы, будет работать. Если это не происходит, вы не можете отправить его другим ресурсам на другом процессе, компьютере и т. Д. Также см. Здесь для хорошего примера.
Для этого я использую укроп , который может сериализовать практически все в Python. У укропа также есть несколько хороших инструментов помогут вам понять, что приводит к сбою процесса перебора при сбое кода.
И, да, люди используют выбор, чтобы сохранить состояние вычислений, или сеанс ipython , или что-то еще.
Я использовал это в одном из моих проектов. Если приложение было остановлено во время его работы (оно выполняло длинную задачу и обрабатывало много данных), мне нужно было сохранить всю структуру данных и перезагрузить ее после повторного запуска приложения. Для этого я использовал cPickle, так как скорость была очень важна, а размер данных был действительно большим.
Pickle похож на «Save As ..» и «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 с нуля, и я могу просто взять (и) с того места, где остановился.
Для новичка (как и у меня) действительно трудно понять, зачем использовать рассол в первую очередь при чтении официальной документации . Это может быть потому, что документы подразумевают, что вы уже знаете всю цель сериализации. Только после прочтения общего описания сериализации я понял причину этого модуля и его общие случаи использования. Также могут помочь общие объяснения сериализации без учета конкретного языка программирования: https://stackoverflow.com/a/14482962/4383472 , Что такое сериализация? , https://stackoverflow.com/a/3984483/4383472
Я могу рассказать вам об использовании, для которого я его использую, и видел, как он использовался для:
Это те, которые я использую по крайней мере
Я использую маринование во время веб-очистки одного из веб-сайтов в то время, когда я хочу сохранить более 8000 тыс. URL-адресов и хочу обработать их как можно быстрее, поэтому я использую маринование, потому что его выходное качество очень высокое.
Вы можете легко добраться до URL, а там, где вы останавливаете, даже ключевое слово каталога заданий, также можно очень быстро получить подробности URL для возобновления процесса.