Я просмотрел документацию pickle, но не понимаю, где рассол является полезным.
Каковы наиболее распространенные варианты использования рассола?
Я просмотрел документацию pickle, но не понимаю, где рассол является полезным.
Каковы наиболее распространенные варианты использования рассола?
Некоторые варианты использования, с которыми я столкнулся:
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'
Изменить: но что касается вопроса о реальных примерах травления, возможно, наиболее продвинутое использование травления (вам придется копаться довольно глубоко в источнике) ZODB: http://svn.zope.org/
В противном случае PyPI упоминает несколько: http://pypi.python.org/pypi?:action=search&term=pickle&submit=search
Я лично видел несколько примеров отправки по сети маринованных объектов в качестве простого в использовании протокола сетевой передачи.
Травление абсолютно необходимо для распределенных и параллельных вычислений.
Допустим, вы хотите выполнить параллельное сокращение карты с multiprocessing
(или по узлам кластера с помощью pyina), тогда вам нужно убедитесь, что функция, которую вы хотите сопоставить с параллельными ресурсами, будет обработана. Если он не рассолится, вы не сможете отправить его другим ресурсам на другом процессе, компьютере и т. Д. См. Также вот хороший пример.
Для этого я использую dill, который может сериализовать практически все на Python. У Дилла также есть несколько хороших инструментов, которые помогут вам понять, что вызывает ваше травление не сработает, когда ваш код не работает.
И, да, люди используют выборку для сохранения состояния вычисления или сеанса ipython или чего-то еще.
Я использовал его в одном из своих проектов. Если приложение было остановлено во время работы (оно выполняло длительную задачу и обрабатывало много данных), мне нужно было сохранить всю структуру данных и перезагрузить ее после повторного запуска приложения. Я использовал для этого cPickle, так как скорость была решающим фактором, а размер данных был действительно большим.
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) с того места, где остановился.
Для новичка (как и в случае со мной) действительно сложно понять, зачем вообще использовать рассол при чтении официальная документация. Возможно, потому, что в документации подразумевается, что вы уже знаете всю цель сериализации. Только прочитав общее описание сериализации, я понял причину этого модуля и его обычное использование. случаи. Также могут помочь общие объяснения сериализации без учета конкретного языка программирования: https://stackoverflow.com/a/14482962/4383472 , Что такое сериализация?, https://stackoverflow.com/a/3984483/4383472
Чтобы добавить реальный пример: Инструмент документации Sphinx для Python использует pickle для кэширования проанализированных документов и перекрестных ссылок. между документами, чтобы ускорить последующие сборки документации.
Я могу рассказать вам, для чего я его использую и видел, для чего:
Это те, которые я использую по крайней мере
Я использую травление во время парсинга одного из веб-сайтов. В то время я хочу сохранить более 8000 тысяч URL-адресов и обрабатывать их как можно быстрее, поэтому я использую травление, потому что качество его вывода очень высокое.
вы можете легко добраться до URL-адреса, и там, где вы остановите, даже ключевое слово в каталоге заданий, также очень быстро получите подробные сведения об URL-адресе для возобновления процесса.