Сериализация Python - почему мариновать?
Я понял, что Python pickling - это способ "сохранить" объект Python таким образом, чтобы он соблюдал программирование объектов - в отличие от вывода, записанного в txt-файле или БД.
У вас есть более подробная информация или ссылки по следующим пунктам:
- где хранятся маринованные предметы?
- почему травление сохраняет представление объекта больше, чем, скажем, хранение в БД?
- я могу получить засоленные объекты из одного сеанса оболочки Python в другой?
- У вас есть важные примеры, когда сериализация полезна?
- подразумевает ли сериализация с помощью pickle "сжатие" данных?
Другими словами, я ищу документ по травлению - Python.doc объясняет, как реализовать рассол, но, похоже, не углубляется в детали использования и необходимости сериализации.
3 ответа
Pickling - это способ преобразования объекта Python (списка, dict и т. Д.) В поток символов. Идея состоит в том, что этот поток символов содержит всю информацию, необходимую для восстановления объекта в другом скрипте Python.
Что касается того, где хранится маринованная информация, обычно можно сделать:
with open('filename', 'wb') as f:
var = {1 : 'a' , 2 : 'b'}
pickle.dump(var, f)
Это будет хранить маринованную версию нашего var
dict в файле 'filename'. Затем в другом скрипте вы можете загрузить этот файл в переменную, и словарь будет воссоздан:
with open('filename','rb') as f:
var = pickle.load(f)
Другое использование для выбора - если вам нужно передать этот словарь по сети (возможно, с сокетами или чем-то подобным). Сначала вам нужно преобразовать его в поток символов, затем вы можете отправить его через соединение с сокетом.
Кроме того, здесь нет "сжатия", о котором можно говорить... это просто способ преобразования из одного представления (в ОЗУ) в другое (в "тексте").
About.com имеет хорошее представление о травлении здесь.
Травление абсолютно необходимо для распределенных и параллельных вычислений.
Скажем, вы хотели сделать параллельное сопоставление с multiprocessing
(или через узлы кластера с pyina), тогда вам нужно убедиться, что функция, которую вы хотите отобразить на параллельные ресурсы, будет работать. Если это не происходит, вы не можете отправить его другим ресурсам на другом процессе, компьютере и т. Д. Также посмотрите хороший пример здесь.
Для этого я использую укроп, который может сериализовать практически все в Python. У Дилла также есть несколько хороших инструментов, которые помогут вам понять, что приводит к сбою процесса перебора при сбое кода.
И, да, люди используют выбор, чтобы сохранить состояние вычислений, или сеанс ipython, или что-то еще. Вы также можете расширить Pickler и UnPickler, чтобы сделать сжатие с bz2
или же gzip
если хочешь.
Я считаю, что это особенно полезно для больших и сложных пользовательских классов. В конкретном примере, о котором я думаю, "сбор" информации (из базы данных) для создания класса был уже полдела. Затем эта информация, хранящаяся в классе, может быть изменена пользователем во время выполнения.
Вы можете иметь другую группу таблиц в базе данных и написать другую функцию, чтобы просмотреть все сохраненное и записать ее в новые таблицы базы данных. Затем вам нужно написать другую функцию, чтобы иметь возможность загружать что-то сохраненное, читая всю эту информацию обратно.
В качестве альтернативы, вы можете выбрать весь класс как есть и затем сохранить его в одном поле в базе данных. Затем, когда вы вернетесь, чтобы загрузить его обратно, все сразу загрузится, как это было раньше. Это может в конечном итоге сэкономить много времени и кода при сохранении и извлечении сложных классов.
Это своего рода сериализация. используйте cPickle, это намного быстрее, чем мариновать.
import pickle
##make Pickle File
with open('pickles/corups.pickle', 'wb') as handle:
pickle.dump(corpus, handle)
#read pickle file
with open('pickles/corups.pickle', 'rb') as handle:
corpus = pickle.load(handle)