Сериализация Python - Почему рассол?

Я понял, что травление Python - это способ "сохранить" объект Python таким образом, который уважает Object-программирование - отличное от вывода, написанного в txt файле или DB.

У вас есть более подробная информация или ссылки по следующим пунктам:

  • где хранятся маринованные объекты?
  • Почему трассировка сохраняется для представления объекта больше, чем, скажем, для хранения в БД?
  • Можно ли извлекать маринованные объекты из одного сеанса оболочки Python в другой?
  • Есть ли у вас важные примеры, когда сериализация полезна?
  • Сериализация с pickle подразумевает сжатие данных?

Другими словами, я ищу документ для травления - Python.doc объясняет, как реализовать рассол, но, похоже, не погружается в детали о пользе и необходимости сериализации.

Ответ 1

Травление - это способ преобразования объекта python (список, dict и т.д.) в поток символов. Идея состоит в том, что этот поток символов содержит всю информацию, необходимую для восстановления объекта в другом python script.

Что касается того, где хранится информация о маринованной массе, обычно можно делать:

with open('filename', 'wb') as f:
    var = {1 : 'a' , 2 : 'b'}
    pickle.dump(var, f)

Это сохранит маринованную версию нашего var dict в файле "filename". Затем, в другом script, вы можете загрузить из этого файла в переменную, и словарь будет воссоздан:

with open('filename','rb') as f:
    var = pickle.load(f)

Другое использование для травления - если вам нужно передать этот словарь по сети (возможно, с сокетами или чем-то другим). Сначала вам нужно преобразовать его в поток символов, после чего вы можете отправить его по сокетному соединению.

Кроме того, здесь нет "сжатия"... это просто способ преобразования из одного представления (в ОЗУ) в другой (в "тексте" ).

About.com имеет приятное введение травления здесь.

Ответ 2

Травление абсолютно необходимо для распределенных и параллельных вычислений.

Предположим, что вы хотите выполнить параллельное отображение карты с помощью multiprocessing (или между узлами кластера с pyina), тогда вам нужно чтобы убедиться, что функция, которую вы хотите сопоставить по параллельным ресурсам, будет размножаться. Если он не раскалывается, вы не можете отправить его другим ресурсам на другой процесс, компьютер и т.д. Также см. здесь для хорошего пример.

Для этого я использую dill, который может сериализовать почти что угодно в python. У Dill также есть несколько хороших инструментов, помогающих понять, что приводит к сбою вашего травления, когда ваш код выходит из строя.

И да, люди используют сбор, чтобы сохранить состояние вычисления, или ваш ipython сеанс или что-то еще. Вы также можете расширить pickle Pickler и UnPickler для сжатия с помощью bz2 или gzip, если хотите.