2011-07-12 11 views
7

Estoy escribiendo un programa de python que necesita procesar una gran cantidad de mensajes pequeños pero complejos codificados con protobuf. Traté de usar la implementación de Python de los búferes de protocolo, que está escrito en python puro, pero su rendimiento es realmente terrible.usando swig para enlazar buffers de protocolo de Google

Así que estoy buscando una solución que aparentemente some folks got to work - use el protocolo para generar archivos C++, luego use swig para envolverlos con python. El problema es que no puedo acceder a un módulo de Python en funcionamiento.

  • Cuando se ejecuta trago con -includeall, a asegurar que todas las clases de base/utilidad de Google utilizados por los clases de mensajes generados también envolverse - trago falla, quejándose de sistema que faltan archivos de inclusión (por ejemplo, "cadena") . No podría evitar esto con -I banderas o copia de directorios completos de inclusión. El entorno es Ubuntu 10.04, protobuf 2.2.0, swig 1.3.40, gcc 4.4.3.

  • Sin este indicador, soy capaz de generar un módulo de Python para mis clases de mensaje, pero este módulo es inútil: los Python clases de mensajes generados faltan todas las funciones proporcionadas por la clase base Mensaje - en en particular todos menos uno de los métodos de deserialización. El único método que queda (MergePartialFromCodedStream) no se ejecutará, ya que requiere una entrada de tipo CodedInputStream (que es parte de la infraestructura protobuf y por lo tanto no está empaquetado con swig).

Me preguntaba si alguien tiene un ejemplo práctico de conseguir un trago para trabajar sobre protobuf-C++?

Alternativamente, ¿hay algún ejemplo de alguna otra solución, como la extensión de Python mencionada en la misma página? Aunque parece una solución de alto mantenimiento para mi esquema dinámico ...

Si nada de esto funciona, estoy considerando dejar Python a favor de Groovy, suponiendo que la implementación de Java de los búferes de protocolo sería más eficiente. ¿Algún comentario sobre eso?

Muchas Gracias!

Respuesta

0

Intenta% incluir sus encabezados generados en su archivo SWIG y también los archivos de la clase base explícitamente (en lugar de usar includeall). Debería ser lo suficientemente explícito como para que SWIG entienda que desea vincular las clases base y las derivadas.

+0

Gracias John ... Finalmente conseguí este resuelto mediante el uso de la herramienta Greplin (https://github.com/Greplin) - ¡muy recomendable! –

1

Aquí está el enlace correcto a la solución Greplin fast-python-pb que terminé usando. Es muy fácil de usar (al menos en Linux) y el rendimiento es x100 veces superior.

Este software todavía es joven y no es 100% compatible con la implementación de Google, al menos en lo que respecta a valores vacíos en campos opcionales, pero las diferencias son bastante menores.

Cuestiones relacionadas