Каковы преимущества не использования cPickle для создания персистентного устройства хранения данных для данных?

Для записи можно также использовать std::stringstream , если Вы хотите создать строку, прежде чем это будет на самом деле произведено.

5
задан Brian Tompsett - 汤莱恩 9 November 2015 в 20:55
поделиться

7 ответов

Травление - это двуликая монета.

С одной стороны, у вас есть способ очень легко хранить ваш объект. Всего четыре строчки кода - и все. У вас есть объект такой, какой он есть.

С другой стороны, это может стать кошмаром совместимости. Вы не можете распаковать объекты, если они не определены в вашем коде, в точности так, как они были определены при мариновании. Это сильно ограничивает ваши возможности по рефакторингу кода или перегруппировке вещей в ваших модулях. Кроме того, не все можно мариновать, и если вы не строго придерживаетесь того, что нужно мариновать, и клиент вашего кода имеет полную свободу включать любой объект, рано или поздно он передаст что-то недоступное для вашей системы, и система взорвется. .

Будьте очень осторожны при его использовании. нет лучшего определения быстрого и грязного.

10
ответ дан 18 December 2019 в 09:09
поделиться

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

Требуется 37 байтов, чтобы выбрать объект с одним целым значением:

>>> import pickle
>>> class Foo: pass... 
>>> foo = Foo()
>>> foo.x = 3
>>> print repr(pickle.dumps(foo))
"(i__main__\nFoo\np0\n(dp1\nS'x'\np2\nI3\nsb."

В эти данные встроено имя свойства и его тип. Пользовательский сериализатор для Foo (и только для Foo) мог бы обойтись без этого и просто сохранить номер, сэкономив как время, так и пространство.

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

На практике я бы построил что-нибудь, используя общий модуль cPickle, и заменил бы его, только если профилирование показало, что это действительно важно. Поддержание отдельной структуры сериализации - это значительный объем работы.

И последний ресурс, который может оказаться полезным: некоторые тесты синтетического сериализатора . cPickle работает довольно быстро.

Я бы построил что-нибудь, используя общий модуль cPickle, и заменил бы его, только если профилирование показало, что это действительно важно. Поддержание отдельной структуры сериализации - это значительный объем работы.

И последний ресурс, который может оказаться полезным: некоторые тесты синтетического сериализатора . cPickle работает довольно быстро.

Я бы построил что-нибудь, используя общий модуль cPickle, и заменил бы его, только если профилирование показало, что это действительно важно. Поддержание отдельной структуры сериализации - это значительный объем работы.

И последний ресурс, который может оказаться полезным: некоторые тесты синтетического сериализатора . cPickle работает довольно быстро.

3
ответ дан 18 December 2019 в 09:09
поделиться

Обратите внимание, что не все объекты могут быть непосредственно обработаны - только базовые типы или объекты, которые определили протокол pickle.
Использование вашего собственного двоичного формата позволит вам потенциально хранить любой тип объекта.

Для заметки, Zope Object DB (ZODB) следует тому же самому подходу, сохраняя объекты в формате Pickle. Возможно, вам будет интересно получить их реализации.

2
ответ дан 18 December 2019 в 09:09
поделиться

Потенциальные преимущества настраиваемого формата по сравнению с рассолом следующие:

  • вы можете выборочно получать отдельные объекты, вместо того, чтобы воплощать полный набор объектов
  • вы можете запрашивать подмножества объекты по свойствам и загружать только те объекты, которые соответствуют вашим критериям

Материализованы ли эти преимущества, конечно, зависит от того, как вы проектируете хранилище.

1
ответ дан 18 December 2019 в 09:09
поделиться

Если вы собираетесь это сделать (реализовать свой собственный двоичный формат), вы должны сначала знать, что у python есть хорошая библиотека для обработки HDF5, двоичного формата, используемого в физике и астрономии. для сброса огромных объемов данных.

Это домашняя страница библиотеки:

В принципе, вы можете думать о HDF5 как об иерархической базе данных, в которой столбец таблицы может сам по себе содержать внутреннюю таблицу: в таблице Populations есть столбец с именем Individual, который представляет собой таблицу, содержащую информацию о каждом человеке и т. д.

PyTables также имеет собственную реализацию модуля cPickle, вы можно получить к нему доступ с помощью:

1
ответ дан 18 December 2019 в 09:09
поделиться

Придется ли вам когда-нибудь обрабатывать данные из ненадежных источников? Если это так, вы должны знать, что формат pickle на самом деле представляет собой виртуальную машину, которая способна выполнять произвольный код от имени процесса, выполняющего распаковку.

0
ответ дан 18 December 2019 в 09:09
поделиться

Возможно, вы захотите попробовать My CPP Quiz, поскольку в нем есть набор очень всеобъемлющих вопросов по C ++. Если вы легко справитесь с этим, вы можете считать, что имеете удовлетворительное понимание основ C ++.

http: //www.mycppquiz.

[В комментариях к исходным сноскам обсуждается, почему pickle был выбран вместо json.]

1
ответ дан 18 December 2019 в 09:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: