Я просмотрел документацию pickle, но я не понимаю, где рассол полезен.
Каковы некоторые общие случаи использования для рассола?
Я просмотрел документацию pickle, но я не понимаю, где рассол полезен.
Каковы некоторые общие случаи использования для рассола?
Некоторые из применений, с которыми я столкнулся:
1) сохранение данных состояния программы на диск, чтобы он мог продолжать, когда он был остановлен при перезапуске (сохранение)
2) отправка данных python по TCP-соединению в многоядерной или распределенной системе (сортировка)
3) сохранение объектов python в базе данных
4) преобразование произвольного объекта python в строку, чтобы он мог использоваться как ключ словаря (например, для кеширования и memoization).
Есть некоторые проблемы с последним - два одинаковых объекта могут быть маринованными и привести к разным строкам - или даже один и тот же объект, маринованный дважды, может иметь разные представления. Это связано с тем, что рассол может содержать информацию о количестве ссылок.
Минимальный пример в кругоходе.
>>> 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. У Dill также есть несколько хороших инструментов, помогающих понять, что приводит к сбою вашего травления, когда ваш код выходит из строя.
И да, люди используют сбор, чтобы сохранить состояние вычисления, или ваш ipython сеанс или что-то еще.
Я использовал его в одном из моих проектов. Если приложение было завершено во время его работы (оно выполняло длительную задачу и обрабатывало множество данных), мне нужно было сохранить всю структуру данных и перезагрузить ее после повторного запуска приложения. Я использовал cPickle для этого, так как скорость была важной вещью, а размер данных был действительно большим.
Для новичка (как в случае со мной) очень сложно понять, почему использовать рассол в первую очередь при чтении официальной документации . Возможно, потому, что документы подразумевают, что вы уже знаете всю цель сериализации. Только после прочтения общее описание сериализации я понял причину этого модуля и его общие варианты использования. Также широкое объяснение сериализации без учета конкретного языка программирования может помочь: fooobar.com/questions/59637/..., Что такое сериализация?, fooobar.com/questions/59638/...
Чтобы добавить пример реального мира: Sphinx инструмент документации для Python использует pickle для кэширования анализируемых документов и перекрестных ссылок между документами, чтобы ускорить последующие сборки документации.
Я могу сказать вам, для каких целей я использую его, и видел, как он использовался для:
Это те, которые я использую, по крайней мере,
Я использую травление во время веб-ломания одного из веб-сайтов в то время, когда я хочу хранить более 8000 тыс. URL-адресов и хочу обрабатывать их как можно быстрее, поэтому я использую травление, потому что его качество вывода очень велико.
вы можете легко дойти до URL-адреса и где вы остановите даже ключевое слово каталога заданий, также очень быстро извлекайте детали URL-адреса для возобновления процесса.
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), с которого я остановился.