Я просмотрел документацию pickle, но я не понимаю, где рассол полезен.Обычные прецеденты для рассола в Python
Каковы некоторые распространенные прецеденты для рассола?
Я просмотрел документацию pickle, но я не понимаю, где рассол полезен.Обычные прецеденты для рассола в Python
Каковы некоторые распространенные прецеденты для рассола?
Некоторых видов использования, которые я встречал:
1) сохранение данных о состоянии программы, на диск, чтобы он мог продолжать, где она была прервана при перезапуске (настойчивость)
2) отправки питона данных по соединение TCP в многоядерном или распределенную система (сортировочный)
3) хранение объектов питона в базе данных
4) превращение произвольного объекта питона в строку, так что она может быть использована в качестве словаря ключа (например, для c ношение & memoization).
Есть некоторые проблемы с последним - два одинаковых объекта могут быть маринованными и привести к разным строкам - или даже один и тот же объект, маринованный дважды, может иметь разные представления. Это связано с тем, что рассол может включать в себя информацию счетчика ссылок.
Нельзя передавать травленные объекты по сети или другим ненадежным каналам, если только маринованные данные не защищены от манипуляций. Документация pickle явно предупреждает * никогда не распаковывать данные из ненадежных или не прошедших проверку подлинности источников. – lunaryorn
@лунариорн: хорошая точка. Если вы собираетесь передавать маринованные данные между машинами, используйте безопасный канал, например, SSL или SSH-туннелирование. –
Тогда вы по-прежнему доверяете конечной точке не использовать вас, что может быть или не быть в порядке, в зависимости от контекста. –
Minimal туда и обратно пример ..
>>> 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
Я лично видел несколько примеров травильных объектов, отправляемых по сети в качестве простого в использовании протокола передачи сети.
Я использовал его в одном из своих проектов. Если приложение было прекращено во время его работы (оно выполняло длительную задачу и обрабатывало множество данных), мне нужно было сохранить всю структуру данных и перезагрузить ее после повторного запуска приложения. Я использовал cPickle для этого, так как скорость была важной вещью, а размер данных был действительно большим.
Чтобы добавить пример реального мира: Инструмент документации Sphinx для Python использует pickle для кэширования анализируемых документов и перекрестных ссылок между документами, чтобы ускорить последующие сборки документации.
Травление абсолютно необходимо для распределенных и параллельных вычислений.
Предположим, что вы хотите выполнить параллельное сокращение карты с помощью multiprocessing
(или через узлы кластера с pyina), тогда вам нужно убедиться, что функция, которую вы хотите сопоставить через параллельные ресурсы, будет размножаться. Если он не маринован, вы не можете отправить его другим ресурсам на другой процесс, компьютер и т. Д. Также см. here для хорошего примера.
Для этого я использую dill, который может сериализовать почти что угодно в python. У Dill также есть some good tools, чтобы помочь вам понять, что приводит к сбою вашего травления, когда ваш код выходит из строя.
И, да, люди используют сбор, чтобы сохранить состояние расчета, или ваш сеанс ipython, или что-то еще.
Для новичка (как в случае со мной) очень сложно понять, почему использовать рассол в первую очередь при чтении official documentation. Возможно, потому, что документы подразумевают, что вы уже знаете всю цель сериализации. Только после прочтения сериализации general description я понял причину этого модуля и его общие варианты использования. Также широкие объяснения сериализации считаясь конкретным языком программирования могут помочь: https://stackoverflow.com/a/14482962/4383472, What is serialization?, https://stackoverflow.com/a/3984483/4383472
ваш «ответ» - это не ответ, это скорее комментарий. Вопрос OP: «Каковы некоторые общие случаи использования рассола?». Считаете ли вы, что вы так или иначе ответили на этот вопрос? –
Хорошо, я чувствую, что ответил на этот вопрос, потому что у меня также были трудности с пониманием общего использования рассола, когда я пытался прочитать об этом модуле [здесь] (https://docs.python.org/3.4/library/pickle. html), [здесь] (http://en.wikipedia.org/wiki/Pickle_ (Python)) и [здесь] (http://pymotw.com/2/pickle/index.html). Потому что в основном они начинают объяснять, что рассол предполагает, что вы знаете мотивацию всей концепции сериализации. После того, как я прочитал простую статью о сериализации, я понял общую идею, а также «общие случаи».Может быть, это поможет кому-то ... – Bad
и некоторые из этих распространенных случаев ...? Если есть некоторые, которые не перечислены здесь в других ответах ... добавление их к вашему ответу было бы очень уместным. –
Я могу сказать вам пользы, я использую его для и видел это используется для:
Это те, которые я использую его по крайней мере
соленья походит «Сохранить как ..» и «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 с нуля, и я могу просто выбрать (ле) от того, где я оставил выкл.
У меня есть что-то похожее на Google, но Google недостаточно умен, чтобы сказать мне, как может мне помочь определенный модуль. Я знаю, как использовать «pickle», но то, что я хочу знать, в том, что сценарий использует другие люди. – satoru
В этом вопросе нет ничего плохого. – FogleBird
Upvote. Такие вопросы очень важны для Stackoverflow. –