在Sage中使用Python的pickle导致高内存使用率

时间:2013-11-29 23:19:17

标签: python memory-management sage

我正在使用基于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,我觉得很奇怪。

1 个答案:

答案 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。我只是这样做,尽可能地保持你的榜样。