В чем разница между рассолом и полкой?
Я узнаю о сериализации объектов в первый раз. Я пытался читать и "гуглить" из-за различий в модуле "соление" и "полка", но я не уверен, что понимаю это. Когда использовать какой? 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:
- Простота в использовании: DBM — это базовое хранилище ключей и значений, требующее минимальной настройки. Быстрота: DBM обеспечивает быстрый доступ к данным, особенно по сравнению с другими вариантами хранения на основе дисков.
- Может обрабатывать большие объемы данных: DBM может обрабатывать очень большие наборы данных, если у вас достаточно места на диске.
- Минусы:
- Ограниченная функциональность: DBM представляет собой простое хранилище ключей и значений и не предоставляет расширенных функций, таких как транзакции или параллелизм нескольких процессов.
- Плохо подходит для сложных структур данных: DBM лучше всего подходит для хранения простых пар ключ-значение и может быть не лучшим выбором для сложных структур данных, требующих нескольких значений для каждого ключа или более продвинутых возможностей запросов.
Полка:
- PRO:
- Богатая функциональность: Shelve предоставляет более богатый API для доступа к данным, включая возможность хранения нескольких значений для каждого ключа, поддержку транзакций и более продвинутые возможности запросов.
- Простота в использовании: Shelve — это более удобный API, чем DBM, поскольку он предоставляет интерфейс, похожий на словарь, для хранения и поиска данных.
- ПРОТИВ:
Медленнее, чем DBM:
Shelve имеет более высокие накладные расходы по сравнению с DBM и может не подходить для больших наборов данных или приложений с высокими требованиями к производительности.
Может плохо масштабироваться: Shelve может быть не в состоянии обрабатывать очень большие наборы данных или высокие уровни параллелизма, поскольку он может быть более подвержен блокировкам и другим проблемам с производительностью.