Распространенные сценарии использования pickle в Python - PullRequest
125 голосов
/ 09 августа 2010

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

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

Ответы [ 9 ]

55 голосов
/ 09 августа 2010

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

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

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

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

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

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

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

10 голосов
/ 09 августа 2010

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

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

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

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

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

7 голосов
/ 14 октября 2013

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

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

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

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

7 голосов
/ 09 августа 2010

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

4 голосов
/ 10 марта 2015

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

3 голосов
/ 14 апреля 2017

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

Сохранение:

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

2 голосов
/ 31 июля 2012

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

1 голос
/ 20 июля 2018

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

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

1 голос
/ 30 мая 2016

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

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

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

...