В чем разница между рассолом и полкой?

Я узнаю о сериализации объектов в первый раз. Я пытался читать и "гуглить" из-за различий в модуле "соление" и "полка", но я не уверен, что понимаю это. Когда использовать какой? Pickle может превратить каждый объект python в поток байтов, который можно сохранить в файле. Тогда зачем нам модуль полки? Разве рассол не быстрее?

3 ответа

Решение

pickle предназначен для сериализации некоторого объекта (или объектов) в виде одного потока в файле.

shelve строится на вершине pickle и реализует словарь сериализации, где объекты выбираются, но связаны с ключом (некоторая строка), так что вы можете загрузить отложенный файл данных и получить доступ к своим объектам через ключи. Это может быть удобнее, если вы сериализуете много объектов.

Вот пример использования между ними. (должно работать в последних версиях Python 2.7 и Python 3.x).

pickle пример

import pickle

integers = [1, 2, 3, 4, 5]

with open('pickle-example.p', 'wb') as pfile:
    pickle.dump(integers, pfile)

Это сбросит integers список в двоичный файл с именем pickle-example.p,

Теперь попробуйте прочитать маринованный файл обратно.

import pickle

with open('pickle-example.p', 'rb') as pfile:
    integers = pickle.load(pfile)
    print integers

Выше следует выводить [1, 2, 3, 4, 5],

shelve пример

import shelve

integers = [1, 2, 3, 4, 5]

# If you're using Python 2.7, import contextlib and use
# the line:
# with contextlib.closing(shelve.open('shelf-example', 'c')) as shelf:
with shelve.open('shelf-example', 'c') as shelf:
    shelf['ints'] = integers

Обратите внимание, как вы добавляете объекты на полку через словарный доступ.

Прочитайте объект обратно с помощью кода, подобного следующему:

import shelve

# If you're using Python 2.7, import contextlib and use
# the line:
# with contextlib.closing(shelve.open('shelf-example', 'r')) as shelf:
with shelve.open('shelf-example', 'r') as shelf:
    for key in shelf.keys():
        print(repr(key), repr(shelf[key])))

Выход будет 'ints', [1, 2, 3, 4, 5],

Согласно документации по рассолу:

Сериализация - более примитивное понятие, чем настойчивость; Хотя pickle читает и записывает файловые объекты, он не решает ни проблемы именования постоянных объектов, ни (даже более сложной) проблемы одновременного доступа к постоянным объектам. Модуль pickle может преобразовывать сложный объект в поток байтов и может преобразовывать поток байтов в объект с той же внутренней структурой. Возможно, наиболее очевидная вещь, которую можно сделать с этими потоками байтов, - это записать их в файл, но также возможно отправить их по сети или сохранить в базе данных. Модуль полки предоставляет простой интерфейс для выделения и извлечения объектов из файлов базы данных в стиле DBM.

За и против

Поскольку никто на самом деле не упомянул


ДБМ:

  • PRO:
  1. Простота в использовании: DBM — это базовое хранилище ключей и значений, требующее минимальной настройки. Быстрота: DBM обеспечивает быстрый доступ к данным, особенно по сравнению с другими вариантами хранения на основе дисков.
  2. Может обрабатывать большие объемы данных: DBM может обрабатывать очень большие наборы данных, если у вас достаточно места на диске.
  • Минусы:
  1. Ограниченная функциональность: DBM представляет собой простое хранилище ключей и значений и не предоставляет расширенных функций, таких как транзакции или параллелизм нескольких процессов.
  2. Плохо подходит для сложных структур данных: DBM лучше всего подходит для хранения простых пар ключ-значение и может быть не лучшим выбором для сложных структур данных, требующих нескольких значений для каждого ключа или более продвинутых возможностей запросов.

Полка:

  • PRO:
  1. Богатая функциональность: Shelve предоставляет более богатый API для доступа к данным, включая возможность хранения нескольких значений для каждого ключа, поддержку транзакций и более продвинутые возможности запросов.
  2. Простота в использовании: Shelve — это более удобный API, чем DBM, поскольку он предоставляет интерфейс, похожий на словарь, для хранения и поиска данных.
  • ПРОТИВ:

Медленнее, чем DBM:

  1. Shelve имеет более высокие накладные расходы по сравнению с DBM и может не подходить для больших наборов данных или приложений с высокими требованиями к производительности.

  2. Может плохо масштабироваться: Shelve может быть не в состоянии обрабатывать очень большие наборы данных или высокие уровни параллелизма, поскольку он может быть более подвержен блокировкам и другим проблемам с производительностью.

Другие вопросы по тегам