Empecé a utilizar la biblioteca de búferes de protocolo, pero noté que usaba grandes cantidades de memoria. ¡wmpler.asizeof muestra que uno de mis objetos es aproximadamente 76k! Básicamente, contiene algunas cadenas, algunos números y algunas enumeraciones, y algunas listas opcionales de los mismos. Si estuviera escribiendo lo mismo que una C-struct, esperaría que fuera de unos cientos de bytes, y de hecho el método ByteSize devuelve 121 (el tamaño de la cadena serializada).Buffers de protocolo de Google enormes en python
¿Es lo que espera de la biblioteca? Había oído que era lento, pero esto no se puede usar y me hace sentir más inclinado a creer que lo estoy usando mal.
Editar
Aquí es un ejemplo I construido. Este es un archivo pb similar, pero más simple que lo que he estado usando
package pb;
message A {
required double a = 1;
}
message B {
required double b = 1;
}
message C {
required double c = 1;
optional string s = 2;
}
message D {
required string d = 1;
optional string e = 2;
required A a = 3;
optional B b = 4;
repeated C c = 5;
}
Y aquí lo estoy usando
>>> import pb_pb2
>>> a = pb_pb2.D()
>>> a.d = "a"
>>> a.e = "e"
>>> a.a.a = 1
>>> a.b.b = 2
>>> c = a.c.add()
>>> c.c = 5
>>> c.s = "s"
>>> import pympler.asizeof
>>> pympler.asizeof.asizeof(a)
21440
>>> a.ByteSize()
42
Tengo la versión 2.2.0 de protobuf (un poco viejo en este punto) y python 2.6.4.
Parte del código de demostración que reproduce el comportamiento estaría bien. – phihag
@phihag Aquí hay algo similar reproduciendo el comportamiento. –