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

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

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


person satoru    schedule 09.08.2010    source источник
comment
Часть, которую я не понимаю о травлении, - это почему бы вам просто не сохранить значение в файл? Зачем мариновать?   -  person whackamadoodle3000    schedule 11.08.2017


Ответы (9)


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

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

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

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

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

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

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

person Dave Kirby    schedule 09.08.2010
comment
Не следует передавать протравленные объекты по сети или другим ненадежным каналам, если только протравленные данные не защищены от манипуляций. Документация pickle явно предупреждает, что нельзя никогда извлекать данные из ненадежных или неаутентифицированных источников. - person lunaryorn; 09.08.2010
comment
@lunaryorn: хороший момент. Если вы собираетесь передавать консервированные данные между машинами, используйте безопасный канал, такой как туннелирование SSL или SSH. - person Dave Kirby; 09.08.2010
comment
Тогда вы по-прежнему уверены, что конечная точка не будет вас эксплуатировать, что может быть нормально или нет, в зависимости от контекста. - person L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o&#x; 20.08.2010
comment
@lunaryorn - хороший вопрос, но в таком случае как мы можем зашифровать данные в открытом доступе. мы должны использовать какую-то другую библиотеку py или не использовать рассол - person Pardeep Sharma; 05.04.2018
comment
Верен ли пункт 4)? Я нашел это с некоторыми (старыми) доказательствами, которые не работают здесь. - person salotz; 15.09.2018
comment
@salotz см. следующий абзац, где я отмечаю, что обработка одной и той же структуры данных дважды может привести к получению разных строк. Является ли это проблемой или нет, зависит от контекста. Если вы используете его в качестве ключа кеша для повышения производительности, то случайные пропуски кеша могут быть незначительными. YMMV. - person Dave Kirby; 15.09.2018
comment
Вы говорите об this? Я не хочу иметь кеш, который вы описываете, я хочу хэшировать их как идентификаторы, и я пытаюсь выяснить, можно ли и как это сделать. Я предполагаю, что если нет ссылок, тогда все должно быть в порядке. Я просто нигде не вижу этого четко задокументированного, как вы это выяснили? - person salotz; 17.09.2018

Пример минимальной поездки туда и обратно.

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

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

person Jacob Oscarson    schedule 09.08.2010

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

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

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

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

person Mike McKerns    schedule 14.10.2013

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

person taskinoor    schedule 09.08.2010

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

person spartan    schedule 14.04.2017

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

person Bad    schedule 10.03.2015
comment
ваш ответ не является ответом, это скорее комментарий. Вопрос OP: каковы некоторые распространенные варианты использования рассола ?. Считаете ли вы, что ответили на этот вопрос каким-либо образом? - person Mike McKerns; 10.03.2015
comment
Что ж, я чувствую, что ответил на вопрос, потому что у меня также были трудности с пониманием общих применений рассола, когда я пытался прочитать об этом модуле здесь, здесь и здесь. Потому что в основном они начинают объяснять, что делает pickle, предполагая, что вы знаете мотивацию всей концепции сериализации. После того, как я прочитал простую вики-статью о сериализации, я понял как общую идею, так и распространенные случаи. Может, это кому-нибудь поможет ... - person Bad; 10.03.2015
comment
и некоторые из этих распространенных случаев…? Если есть такие, которые не указаны здесь в других ответах… добавление их к вашему ответу было бы очень уместным. - person Mike McKerns; 11.03.2015

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

person lunaryorn    schedule 31.07.2012

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

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

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

person Austin Gummy    schedule 30.05.2016

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

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

person Divanshu Tak    schedule 20.07.2018