Pergunta

aplicativo My Python atualmente usa o python-memcached API para definir e obter objetos em memcached. Esta API usa nativo pickle módulo Python para serializar e de-serialize Python objetos.

Esta API torna mais simples e rápido para armazenar aninhados Python listas, dicionários e tuplas em memcached, e ler esses objetos de volta para o aplicativo é completamente transparente -. Ele simplesmente funciona

mas eu não quero ser limitado a usar Python exclusivamente, e se todos os objetos memcached são serializados com picles, os clientes escritos em outras línguas não vai funcionar.

Aqui estão a serialização cross-platform opções Eu considerei:

  1. XML - o principal benefício é que é legíveis, mas isso não é importante para esta aplicação. XML também tem um espaço muito, e é caro para análise.

  2. JSON - parece ser um bom padrão multi-plataforma, mas eu não tenho certeza de que mantém as características de tipos de objeto quando lido de volta do memcached. Por exemplo, de acordo com este post tuplas são transformados em listas quando usando simplejson ; Também, parece que a adição de elementos para a estrutura JSON poderia quebrar o código escrito para a estrutura antiga

  3. Protocol Buffers do Google - Estou muito interessado neste porque parece muito rápido e compacto - pelo menos 10 vezes menor e mais rápido do que XML; não é legível, mas isso não é importante para esta aplicação; e parece projetado para suportar o crescimento da estrutura sem quebrar código antigo

Considerando as prioridades para este aplicativo, o que é o método de objeto de serialização ideal para memcached?

  1. suporte multi-plataforma (Python, Java, C #, C ++, Ruby, Perl)

  2. Como manusear estruturas de dados aninhados

  3. serialização Rápido / de-serialização

  4. footprint de memória mínima

  5. Flexibilidade para mudar a estrutura sem quebrar código antigo
Foi útil?

Solução 2

Eu tentei vários métodos e liquidada em JSON comprimido como o melhor equilíbrio entre velocidade e consumo de memória. função Pickle nativo do Python é um pouco mais rápido, mas os objetos resultantes não podem ser usados ??com clientes não-Python.

Eu estou vendo. 3: 1 de compressão para que todos os acessos de dados em cache de memória e o aplicativo fica sub-10ms tempos de resposta incluindo renderização de páginas

Aqui está uma comparação de JSON, Thrift, Protocol Buffers e YAML, com e sem compressão:

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

Parece que este teste tem os mesmos resultados que eu fiz com JSON comprimido. Desde que eu não preciso de pré-definir cada estrutura, esta parece ser a resposta mais rápida e menor cross-platform.

Outras dicas

Uma consideração importante é "fazer você quer ter para especificar cada definição de estrutura" ?

Se você está OK com isso, então você pode dar uma olhada em:

  1. Protocol Buffers - http://code.google.com/apis/protocolbuffers /docs/overview.html
  2. Thrift - http://developers.facebook.com/thrift/ (mais voltado para serviços )

Ambas as soluções requerem arquivos de suporte para definir cada estrutura de dados.


Se você preferir não suportar a sobrecarga desenvolvedor de pré-definição de cada estrutura, então dê uma olhada em:

  1. JSON (via python cjson, e JSON PHP nativo). Ambos são realmente muito rápido se você não precisa para transmitir conteúdo binário (como imagens, etc ...).
  2. Yet Another Markup Language @ http://www.yaml.org/ . Também muito rápido se você ficar na biblioteca certa.

No entanto, acredito que ambos tiveram problemas com o transporte de conteúdo binário, que é por isso que eles foram excluídos para o nosso uso. Nota: YAML pode ter um bom suporte binário, você terá que verificar as bibliotecas do cliente - veja aqui: http://yaml.org/type/binary.html


Na nossa empresa, nós rolamos nossa própria biblioteca (Extruct) para serialização entre linguagens com suporte binário. Nós temos atualmente (decentemente) implementações rápidas em Python e PHP, embora não seja devido legível muito humano usando base64 em todas as cordas (suporte binário). Eventualmente, será porta-los para C e usar a codificação mais padrão.

As linguagens dinâmicas como PHP e Python ficar muito lento se você tiver muitas iterações em um loop ou tem que olhar para cada personagem. C, por outro lado brilha em tais operações.

Se você gostaria de ver a implementação de Extruct, por favor me avise. (Informações de contato em http://blog.gahooa.com/ em "About Me")

"suporte multi-plataforma (Python, Java, C #, C ++, Ruby, Perl)"

Pena que este critério é o primeiro. A intenção por trás a maioria das línguas é expressar estruturas de dados fundamentais e processar de forma diferente. É isso que faz vários idiomas um "problema": eles são todos diferentes.

A única representação que é bom em muitas línguas é geralmente impossível. Existem compromissos na riqueza da representação, o desempenho ou ambiguidade.

JSON satisfaz os critérios restantes bem. Mensagens são compactos e analisar rapidamente (ao contrário XML). Nidificação é tratado bem. Alterar estrutura sem código de ruptura é sempre duvidoso - se você remover algo, antigo código vai quebrar. Se você mudar algo que era necessário, antigo código vai quebrar. Se você está adicionando coisas, no entanto, JSON lida com isso também.

Gosto legível. Ela contribui com um monte de depuração e resolução de problemas.

A sutileza de ter tuplas Python se transformar em listas não é um problema interessante. O aplicativo de recebimento já conhece a estrutura que está sendo recebido, e pode ajustá-lo para cima (se isso importa.)


Editar no desempenho.

Analisando os documentos XML e JSON de 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 parece ser significativamente mais rápido para o mesmo conteúdo. Eu usei os módulos Python simplejson e ElementTree em Python 2.5.2.

Você pode estar interessado neste link:

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

Uma alternativa: MessagePack parece ser a serializer mais rápido lá fora. Talvez você possa experimentá-lo.

Hessian atende a todas as suas necessidades. Há uma biblioteca python aqui:

https://github.com/bgilmore/mustaine

A documentação oficial para o protocolo pode ser encontrada aqui:

http://hessian.caucho.com/

Eu usá-lo regularmente em Java e Python. Ele funciona e não necessita de escrever arquivos de definição de protocolo. Eu não poderia dizer-lhe como o serializador executa Python, mas a versão Java é razoavelmente eficiente:

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top