Вопрос

Мое приложение Python в настоящее время использует python-memcached API-интерфейс устанавливать и получать объекты в memcached.Этот API использует родной язык Python модуль для рассола для сериализации и десериализации объектов Python.

Этот API упрощает и ускоряет хранение вложенных списков Python, словарей и кортежей в memcached, и считывание этих объектов обратно в приложение полностью прозрачно - оно просто работает.

Но я не хочу ограничиваться исключительно использованием Python, и если все объекты memcached сериализованы с помощью pickle, то клиенты, написанные на других языках, работать не будут.

Вот кросс-платформенные варианты сериализации, которые я рассмотрел:

  1. XML - главное преимущество заключается в том, что он доступен для чтения человеком, но в данном приложении это не важно.XML также занимает много места, и его анализ обходится дорого.

  2. JSON - кажется хорошим кроссплатформенным стандартом, но я не уверен, что он сохраняет характер типов объектов при обратном чтении из memcached.Например, согласно этот пост кортежи преобразуются в списки при использовании симплджсон;кроме того, похоже, что добавление элементов в структуру JSON может привести к нарушению кода, написанного для старой структуры

  3. Буферы протокола Google - Я действительно заинтересован в этом, потому что это кажется очень быстрым и компактным - по крайней мере, в 10 раз меньше и быстрее, чем XML;это недоступно для чтения человеком, но это не важно для данного приложения;и, похоже, он предназначен для поддержки расширения структуры без взлома старого кода

Учитывая приоритеты для этого приложения, каков идеальный метод сериализации объектов для memcached?

  1. Кроссплатформенная поддержка (Python, Java, C #, C ++, Ruby, Perl)

  2. Обработка вложенных структур данных

  3. Быстрая сериализация /десериализация

  4. Минимальный объем памяти

  5. Гибкость для изменения структуры без взлома старого кода
Это было полезно?

Решение 2

Я попробовал несколько методов и остановился на сжатом JSON как на наилучшем балансе между скоростью и объемом памяти.Встроенная функция Pickle в Python работает немного быстрее, но результирующие объекты нельзя использовать с клиентами, не использующими Python.

Я вижу сжатие 3: 1, поэтому все данные помещаются в memcache, и приложение получает время отклика менее 10 мс, включая рендеринг страницы.

Вот сравнение JSON, Thrift, протокольных буферов и YAML со сжатием и без него:

http://bouncybouncy.net/ramblings/posts/more_on_json_vs_thrift_and_protocol_buffers/

Похоже, этот тест дал те же результаты, что и я со сжатым JSON.Поскольку мне не нужно предварительно определять каждую структуру, это кажется самым быстрым и минимальным кроссплатформенным ответом.

Другие советы

Одно из важных соображений заключается в том, "хотите ли вы указывать каждое определение структуры"??

Если вас это устраивает, то вы могли бы взглянуть на:

  1. Буферы протокола - http://code.google.com/apis/protocolbuffers/docs/overview.html
  2. Бережливость - http://developers.facebook.com/thrift/ (больше ориентирован на услуги)

Оба эти решения требуют вспомогательных файлов для определения каждой структуры данных.


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

  1. JSON (через python cjson и собственный PHP json).Оба варианта действительно очень быстры, если вам не нужно передавать двоичный контент (например, изображения и т.д.).
  2. Еще один Язык разметки @ http://www.yaml.org/.Также очень быстро, если вы получите правильную библиотеку.

Однако я полагаю, что у обоих из них были проблемы с транспортировкой двоичного контента, именно поэтому они были исключены для нашего использования. Примечание: YAML может иметь хорошую двоичную поддержку, вам нужно будет проверить клиентские библиотеки - смотрите здесь: http://yaml.org/type/binary.html


В нашей компании мы внедрили нашу собственную библиотеку (Extruct) для межъязыковой сериализации с поддержкой двоичных файлов.В настоящее время у нас есть (прилично) быстрые реализации на Python и PHP, хотя они не очень удобочитаемы для человека из-за использования base64 для всех строк (поддержка двоичных файлов).В конце концов мы перенесем их на C и будем использовать более стандартную кодировку.

Динамические языки, такие как PHP и Python, становятся очень медленными, если у вас слишком много итераций в цикле или вам приходится просматривать каждый символ.C, с другой стороны, блистает при таких операциях.

Если вы хотите увидеть реализацию Extruct, пожалуйста, дайте мне знать.(контактная информация по адресу http://blog.gahooa.com/ в разделе "Обо мне")

"Кроссплатформенная поддержка (Python, Java, C #, C ++, Ruby, Perl)"

Очень жаль, что этот критерий стоит на первом месте.Цель большинства языков состоит в том, чтобы по-разному выражать фундаментальные структуры данных и их обработку.Это то, что делает несколько языков "проблемой".:они все разные.

Единое представление, которое было бы хорошим на многих языках, как правило, невозможно.Существуют компромиссы в богатстве представления, производительности или двусмысленности.

JSON полностью соответствует остальным критериям.Сообщения компактны и быстро анализируются (в отличие от XML).Вложенность обрабатывается хорошо.Изменять структуру без взлома кода всегда рискованно - если вы что-то удалите, старый код сломается.Если вы измените что-то, что было необходимо, старый код сломается.Однако, если вы что-то добавляете, JSON обрабатывает и это.

Мне нравится понятный для человека текст.Это помогает во многих отладках и устранении неполадок.

Тонкость превращения кортежей Python в списки не является интересной проблемой.Принимающее приложение уже знает получаемую структуру и может настроить ее (если это имеет значение).)


Правка по производительности.

Анализ документов XML и JSON из http://developers.de/blogs/damir_dobric/archive/2008/12/27/performance-comparison-soap-vs-json-wcf-implementation.aspx

xmlParse 0.326 jsonParse 0.255

JSON, по-видимому, работает значительно быстрее для одного и того же контента.Я использовал модули Python SimpleJSON и ElementTree в Python 2.5.2.

Возможно, вас заинтересует эта ссылка :

http://kbyanc.blogspot.com/2007/07/python-serializer-benchmarks.html

Альтернатива :MessagePack, похоже, самый быстрый сериализатор в мире.Может быть, ты сможешь попробовать.

Мешковина отвечает всем вашим требованиям.Здесь есть библиотека python:

https://github.com/bgilmore/mustaine

Официальную документацию к протоколу можно найти здесь:

http://hessian.caucho.com/

Я регулярно использую его как в Java, так и в Python.Это работает и не требует написания файлов определения протокола.Я не мог бы рассказать вам, как работает сериализатор Python, но версия Java достаточно эффективна:

https://github.com/eishay/jvm-serializers/wiki/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top