如何在Google AppEngine上获取python对象的大小(以字节为单位)?

如何在Google AppEngine上获取python对象的大小(以字节为单位)?,python,google-app-engine,memcached,pickle,Python,Google App Engine,Memcached,Pickle,我需要计算一些python对象的大小,这样我就可以将它们分解并存储在memcache中,而不会达到大小限制 GAE环境中的python对象上似乎不存在“sizeof()”,sys.getsizeof()也不可用 GAE本身显然是在幕后检查尺寸,以实施限制。有什么办法可以做到这一点吗?谢谢。memcache在内部始终使用pickle并存储生成的字符串,因此您可以使用len(pickle.dumps(yourobject,-1))进行检查。请注意,sys.getsizeof(需要2.6或更高版本,这

我需要计算一些python对象的大小,这样我就可以将它们分解并存储在memcache中,而不会达到大小限制

GAE环境中的python对象上似乎不存在“sizeof()”,sys.getsizeof()也不可用


GAE本身显然是在幕后检查尺寸,以实施限制。有什么办法可以做到这一点吗?谢谢。

memcache
在内部始终使用
pickle
并存储生成的字符串,因此您可以使用
len(pickle.dumps(yourobject,-1))
进行检查。请注意,sys.getsizeof(需要2.6或更高版本,这就是GAE中缺少它的原因)对您没有任何帮助:

>>> import sys
>>> sys.getsizeof(23)
12
>>> import pickle
>>> len(pickle.dumps(23, -1))
5

由于对象的序列化pickle的大小可能与内存中对象的大小大不相同,正如您所看到的(因此我想您应该感谢GAE没有提供sizeof,这可能会让您误入歧途;-)。

感谢Alex提供的精彩回答和解释。这很有意义。在相关说明中,对用户提供的数据使用pickle安全吗?@Dane,
pickle.dump
(和
.dumps
)是安全的,就像
加载
-返回结果文件或字符串一样。唯一可能不安全的部分是
加载用户提供的字节字符串,即一个字符串(无论是否从文件中获取),而您首先没有使用
pickle
生成该字符串(并且
memcache
不会这样做;-)。@Dane,-1表示“最佳可用”(与较旧版本的Python没有兼容性限制)“--显然,memcache不需要与较旧版本保持兼容,因此它可以在运行它的任何版本中使用“最新和最大的”(节省空间和/或时间,并且可能允许对某些对象类型进行序列化,而这些对象类型是较旧协议不支持的)。值得指出的是,酸洗是一项昂贵的操作,仅为了确定长度而进行酸洗可能是一种浪费。您最好乐观地将其存储到memcache,并捕获异常(如果它太大)。