我正在使用基于Python的Sage数学软件来创建一个很长的向量列表。该列表包含大约100,000,000个元素,sys.getsizeof()告诉我它的大小略小于1GB。
这个列表我挑选成一个文件(已经花了很长时间 - 但足够公平)。只有当我取消这个列表时,它才会变得烦人。 RAM使用率从1.15GB增加到4.3GB,我想知道发生了什么?
我怎样才能在Sage中找到所有内存的用途?您是否有任何想法如何通过应用Python技巧来优化它?
这是对kcrisman评论的回复。
我无法发布的确切代码,因为它太长了。但这是一个可以观察到现象的简单例子。我正在使用Linux 3.2.0-4-amd64#1 SMP Debian 3.2.51-1 x86_64 GNU / Linux。
启动Sage并执行:
import pickle
L = [vector([1,2,3]) for k in range(1000000)]
f = open("mylist", 'w')
pickle.dump(L, f)
在我的系统上,列表大8697472字节,我腌制的文件大约有130MB。现在关闭Sage并观察你的记忆(例如,用htop)。然后执行以下行:
import pickle
f = open("mylist", 'r')
pickle.load(f)
没有sage我的Linux系统使用1035MB内存,当Sage运行时,使用量增加到1131MB。在我取消文件后,它使用了2535MB,我觉得很奇怪。
答案 0 :(得分:2)
最好不要直接使用python的pickle模块。 cPickle已经好一点了,但是sage中的很多酸洗都采用了协议2,其中(c)Pickle没有默认。你可以使用圣人自己的泡菜包装。如果我用
做你的例子sage: open("mylist",'w').write(dumps(L))
然后通过
将其加载到新会话中sage: L = loads(open("mylist",'r').read())
我没有发现任何问题。
请注意,上面的界面不是最好的一个在sage中pickle / unpickle到文件的界面。你最好使用save/load
。我只是这样做,尽可能地保持你的榜样。