我需要计算一些Python对象的大小,以便在不超过大小限制的情况下将它们分解并存储在memcache中。
在GAE环境中,'sizeof()' 似乎不存在于Python对象中,而sys.getsizeof()也无法使用。
GAE本身显然在幕后检查大小以强制执行限制。有什么想法可以完成这个任务吗?谢谢。
我需要计算一些Python对象的大小,以便在不超过大小限制的情况下将它们分解并存储在memcache中。
在GAE环境中,'sizeof()' 似乎不存在于Python对象中,而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,这会让您误入歧途;-)。
pickle.dump
(和.dumps
)是安全的,load
回结果文件或字符串也是安全的。唯一可能不安全的部分是load
一个用户提供的字节串,即一个你没有用pickle
自己生成的字符串(无论是从文件中获取还是其他方式),而memcache
并不会这样做;-)。 - Alex Martelli