Распространенные сценарии использования pickle в Python

134

Я посмотрел документацию по засолке , но не понимаю, где рассол полезен.

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

Сатору
источник
2
Часть, которую я не понимаю о травлении, - почему бы вам просто не сохранить значение в файл? Зачем это мариновать?
whackamadoodle3000

Ответы:

59

Некоторые применения, с которыми я сталкивался:

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

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

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

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

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

Чтобы подчеркнуть комментарий @ lunaryorn - вы никогда не должны извлекать строку из ненадежного источника, так как тщательно созданный рассол может выполнить произвольный код в вашей системе. Например, смотрите https://blog.nelhage.com/2011/03/exploiting-pickle/

Дейв Кирби
источник
27
Не следует передавать засоленные объекты по сети или другим ненадежным каналам, если только засоленные данные не будут тщательно защищены от манипуляций. Документация pickle явно предупреждает, что никогда не следует извлекать данные из ненадежных или не прошедших проверку подлинности источников.
lunaryorn
4
@Lunaryorn: хорошая мысль. Если вы собираетесь передавать маринованные данные между компьютерами, используйте безопасный канал, такой как туннелирование SSL или SSH.
Дейв Кирби
3
Тогда вы все еще доверяете конечной точке не использовать вас, что может быть или не быть хорошо, в зависимости от контекста.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
@lunaryorn - хороший момент, но в таком случае, как мы можем зашифровать данные в открытом доступе. мы должны использовать какой-нибудь другой py lib или не использовать pickle
Pardeep Sharma
Пункт 4) правда? Я нашел это, у которого есть некоторые (старые) доказательства, которые здесь не сработают .
salotz
10

Пример минимального туда-обратно ..

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

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

Джейкоб Оскарсон
источник
8

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

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

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

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

Майк Маккернс
источник
7

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

taskinoor
источник
4

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

спартанский
источник
3

Для новичка (как и у меня) действительно трудно понять, зачем использовать рассол в первую очередь при чтении официальной документации . Это может быть потому, что документы подразумевают, что вы уже знаете всю цель сериализации. Только после прочтения общего описания сериализации я понял причину этого модуля и его общие случаи использования. Также могут помочь общие объяснения сериализации без учета конкретного языка программирования: https://stackoverflow.com/a/14482962/4383472 , Что такое сериализация? , https://stackoverflow.com/a/3984483/4383472

Плохой
источник
Ваш «ответ» - это не ответ, это скорее комментарий. Вопрос ОП: «Каковы некоторые распространенные варианты использования маринада?». Вы чувствуете, что ответили на этот вопрос каким-либо образом?
Майк Маккернс
3
Ну, я чувствую, что ответил на вопрос, потому что у меня также были трудности с пониманием общего использования рассола, когда я пытался прочитать об этом модуле здесь , здесь и здесь . Потому что в основном они начинают объяснять, что делает рассол, предполагая, что вы знаете мотивацию всей концепции сериализации. После того, как я прочитал простую вики-статью о сериализации, я понял общую идею, а также «общие случаи». Может быть, это кому-нибудь поможет ...
Плохо
и некоторые из этих распространенных случаев ...? Если есть такие, которые не перечислены здесь в других ответах ... добавление их в ваш ответ будет очень уместным.
Майк Маккернс
2

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

lunaryorn
источник
1

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

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

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

Остин Гамми
источник
1

Я использую маринование во время веб-очистки одного из веб-сайтов в то время, когда я хочу сохранить более 8000 тыс. URL-адресов и хочу обработать их как можно быстрее, поэтому я использую маринование, потому что его выходное качество очень высокое.

Вы можете легко добраться до URL, а там, где вы останавливаете, даже ключевое слово каталога заданий, также можно очень быстро получить подробности URL для возобновления процесса.

Диваншу Так
источник