Лучший способ сохранять сложные структуры данных Python между сеансами программы (pickle, json, xml, база данных и т. д.)

Нужен совет по наилучшему методу сохранения сложных структур данных Python между программными сеансами.

Вот список методов, которые я придумал на данный момент:

  • рассол / рассол
  • json
  • джсонпикл
  • XML
  • база данных (например, SQLite)

Pickle — самый простой и быстрый метод, но я понимаю, что нет гарантии, что вывод pickle будет работать в различных версиях Python 2.x/3.x или в 32- и 64-битных реализациях Python.

Json работает только с простыми структурами данных. Jsonpickle, кажется, исправляет это И, похоже, написан для работы в разных версиях Python.

Сериализация в XML или в базу данных возможна, но требует дополнительных усилий, поскольку нам придется выполнять сериализацию самостоятельно вручную.

Спасибо, Малькольм.


person Malcolm    schedule 05.01.2010    source источник


Ответы (4)


У вас неправильное представление о соленьях: они гарантированно работают во всех версиях Python. Вам просто нужно выбрать версию протокола, которая поддерживается всеми интересующими вас версиями Python.

Техника, которую вы упустили, - это маршал, который не гарантирует работу в разных версиях Python (и, кстати, так пишутся файлы .pyc).

person Ned Batchelder    schedule 05.01.2010
comment
Нед: Спасибо, что указали на мою путаницу между травлением и сортировкой. - person Malcolm; 05.01.2010

Вы пропустили marshal и модули полки.

Кроме того, эта страница документов python посвящена сохраняемости

person SpliFF    schedule 05.01.2010
comment
SpliFF: Спасибо за ссылку на веб-страницу Python Persistence. - person Malcolm; 05.01.2010

Вы смотрели PySyck или pyYAML?

person rnicholson    schedule 05.01.2010
comment
Миколсон: Я забыл о pyYAML. Похоже на интересный компромисс между JSON (не работает со сложными структурами данных) и pickle. Вы смотрели проект jsonpickle. Тоже очень впечатляет. - person Malcolm; 05.01.2010

Каковы ваши критерии "лучшего"?

  • pickle может выполнять большинство структур Python, в том числе глубоко вложенные
  • sqlite dbs можно легко запросить (если вы знаете sql :)
  • скорость/память? не доверяйте никаким ориентирам, которые вы не подделали сами.

(Мелкий шрифт:
cPickle.dump(protocol=-1) сжимает, в одном случае 15M pickle / 60M sqlite, но может сломаться.
Строки, которые встречаются много раз, например названия стран, могут занимать больше памяти, чем вы ожидать; см. встроенную функцию intern().
)

person denis    schedule 01.02.2010
comment
Денис: Спасибо за ваше предупреждение о протоколе=-1 и чувстве юмора (re: не верьте никаким тестам, которые вы не подделали сами... LMAO!) - person Malcolm; 02.02.2010