In Python große Google-Protokollpuffer

Ich habe angefangen, die Protokollpufferbibliothek zu verwenden, aber festgestellt, dass sie sehr viel Speicher benötigt. pympler.asizeof zeigt, dass ein einzelnes meiner Objekte ungefähr 76k groß ist! Grundsätzlich enthält es einige Zeichenfolgen, einige Zahlen und einige Aufzählungen sowie einige optionale Listen derselben. Wenn ich dasselbe wie eine C-Struktur schreiben würde, würde ich erwarten, dass es unter einigen hundert Bytes liegt, und tatsächlich gibt die ByteSize-Methode 121 (die Größe der serialisierten Zeichenfolge) zurück.

Erwarten Sie das von der Bibliothek? Ich hatte gehört, dass es langsam ist, aber das ist unbrauchbar und lässt mich eher glauben, dass ich es missbrauche.

Bearbeiten

Hier ist ein Beispiel, das ich erstellt habe. Dies ist eine ähnliche pb-Datei, aber einfacher als das, was ich verwendet habe.

    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;
}

Und hier verwende ich sie.

>>> 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

Ich habe Version 2.2.0 von protobuf (zu diesem Zeitpunkt etwas alt) und Python 2.6.4

14
задан pythonic metaphor 8 August 2011 в 19:43
поделиться