serializacion objetos python serialization xml-serialization memcached protocol-buffers

python - serializacion - ¿Cuál es el mejor método de serialización para objetos en memcached?



python memcached (5)

"Soporte multiplataforma (Python, Java, C #, C ++, Ruby, Perl)"

Lástima que este criterio es lo primero. La intención detrás de la mayoría de los lenguajes es expresar las estructuras de datos fundamentales y el procesamiento de manera diferente. Eso es lo que hace que los idiomas múltiples sean un "problema": todos son diferentes.

Una representación única que es buena en muchos idiomas es generalmente imposible. Hay compromisos en la riqueza de la representación, el rendimiento o la ambigüedad.

JSON cumple con los criterios restantes muy bien. Los mensajes son compactos y analizan rápidamente (a diferencia de XML). El anidamiento se maneja muy bien. Cambiar la estructura sin romper el código es siempre dudoso: si elimina algo, el código anterior se romperá. Si cambia algo que se requería, el código antiguo se romperá. Sin embargo, si agrega cosas, JSON maneja esto también.

Me gusta ser legible por los humanos Ayuda con una gran cantidad de depuración y solución de problemas.

La sutileza de tener las tuplas de Python se convierten en listas no es un problema interesante. La aplicación receptora ya conoce la estructura que se está recibiendo y puede ajustarla (si es que importa).

Edita sobre el rendimiento.

Analizando los documentos XML y JSON desde 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 más rápido para el mismo contenido. Usé los módulos Python SimpleJSON y ElementTree en Python 2.5.2.

La aplicación My Python actualmente usa la API python-memcached para establecer y obtener objetos en memcached. Esta API utiliza el módulo pickle nativo de Python para serializar y deserializar objetos de Python.

Esta API simplifica y agiliza el almacenamiento de listas anónimas de Python, diccionarios y tuplas en memcached, y la lectura de estos objetos en la aplicación es completamente transparente; simplemente funciona.

Pero no quiero limitarme a usar Python exclusivamente, y si todos los objetos memcached se serializan con pickle, los clientes escritos en otros idiomas no funcionarán.

Estas son las opciones de serialización multiplataforma que he considerado:

  1. XML: el principal beneficio es que es legible para los humanos, pero eso no es importante en esta aplicación. XML también ocupa mucho espacio y es costoso de analizar.
  2. JSON: parece un buen estándar multiplataforma, pero no estoy seguro de que conserve el carácter de los tipos de objeto cuando se lee desde memcached. Por ejemplo, según esta publicación, las tuplas se transforman en listas cuando se usa simplejson ; Además, parece que agregar elementos a la estructura JSON podría romper el código escrito en la estructura anterior
  3. Buffers de Protocolo de Google - Estoy realmente interesado en esto porque parece muy rápido y compacto - al menos 10 veces más pequeño y más rápido que XML; no es legible por humanos, pero eso no es importante para esta aplicación; y parece diseñado para soportar el crecimiento de la estructura sin romper el código anterior

Teniendo en cuenta las prioridades de esta aplicación, ¿cuál es el método ideal de serialización de objetos para memcached?

  1. Soporte multiplataforma (Python, Java, C #, C ++, Ruby, Perl)
  2. Manejo de estructuras de datos anidados
  3. Serialización / deserialización rápida
  4. Huella de memoria mínima
  5. Flexibilidad para cambiar la estructura sin romper el código antiguo


Probé varios métodos y decidí utilizar JSON comprimido como el mejor equilibrio entre velocidad y memoria. La función Pickle nativa de Python es ligeramente más rápida, pero los objetos resultantes no se pueden usar con clientes que no sean Python.

Veo una compresión 3: 1, por lo que todos los datos encajan en Memcache y la aplicación obtiene tiempos de respuesta inferiores a 10 ms, incluido el procesamiento de páginas.

Aquí hay una comparación de JSON, Thrift, Protocol Buffers y YAML, con y sin compresión:

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

Parece que esta prueba obtuvo los mismos resultados que hice con JSON comprimido. Como no necesito predefinir cada estructura, esta parece ser la respuesta multiplataforma más rápida y más pequeña.



Una consideración importante es "¿desea tener que especificar cada definición de estructura" ?

Si estás de acuerdo con eso, entonces podrías echar un vistazo a:

  1. Buffers de protocolo - http://code.google.com/apis/protocolbuffers/docs/overview.html
  2. Thrift - http://developers.facebook.com/thrift/ (más orientado a los servicios)

Ambas soluciones requieren archivos de soporte para definir cada estructura de datos.

Si prefiere no incurrir en la sobrecarga del desarrollador al predefinir cada estructura, eche un vistazo a:

  1. JSON (a través de python cjson, y PHP nativo json). Ambos son realmente muy rápidos si no necesita transmitir contenido binario (como imágenes, etc.).
  2. Yet Another Markup Language @ http://www.yaml.org/ . También realmente rápido si obtienes la biblioteca correcta.

Sin embargo, creo que ambos han tenido problemas con el transporte de contenido binario, por lo que fueron descartados para nuestro uso. Nota: YAML puede tener una buena compatibilidad binaria, deberá verificar las bibliotecas del cliente, consulte aquí: http://yaml.org/type/binary.html

En nuestra compañía, lanzamos nuestra propia biblioteca (Extruct) para la serialización entre idiomas con soporte binario. Actualmente tenemos implementaciones (decentemente) rápidas en Python y PHP, aunque no es muy fácil de leer debido al uso de base64 en todas las cadenas (soporte binario). Eventualmente los transferiremos a C y usaremos más codificación estándar.

Los lenguajes dinámicos como PHP y Python se vuelven realmente lentos si tiene demasiadas iteraciones en un bucle o tiene que mirar cada carácter. C por otro lado brilla en tales operaciones.

Si desea ver la implementación de Extruct, hágamelo saber. (información de contacto en http://blog.gahooa.com/ en "Acerca de mí")