Сериализация 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)
Другие вопросы по тегам