谷歌协议缓存巨大的python

pyt*_*hor 14 python protocol-buffers

我开始使用协议缓冲库,但注意到它使用了大量内存.pympler.asizeof显示我的一个对象大约是76k!基本上,它包含一些字符串,一些数字和一些枚举,以及一​​些相同的可选列表.如果我写了同样的事情,作为C-结构,我希望它是在几百字节,乃至ByteSize方法返回121(序列化的字符串的大小).

这是你对图书馆的期望吗?我听说它很慢,但这是无法使用的,让我更倾向于相信我在滥用它.

编辑

这是我构建的一个例子.这是一个类似的pb文件,但比我一直使用的更简单

    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;
}
Run Code Online (Sandbox Code Playgroud)

在这里我正在使用它

>>> 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
Run Code Online (Sandbox Code Playgroud)

我有版本2.2.0的protobuf(此时有点旧)和python 2.6.4.

Jer*_*ome 5

对象实例在python中的内存占用量大于编译语言中的内存占用量.例如,以下代码创建了非常简单的类,模仿你的proto显示1440:

class A:
  def __init__(self):
    self.a = 0.0

class B:
  def __init__(self):
    self.b = 0.0

class C:
  def __init__(self):
    self.c = 0.0
    self.s = ""

class D:
  def __init__(self):
    self.d = ""
    self.e = ""
    self.e_isset = 1
    self.a = A()
    self.b = B()
    self.b_isset = 1
    self.c = [C()]

d = D()
print asizeof(d)
Run Code Online (Sandbox Code Playgroud)

我并不感到惊讶的是,protobuf生成的类占用了20倍的内存,因为它们增加了大量的锅炉板.

C++版本肯定不会受此影响.