【发布时间】:2016-11-27 11:31:09
【问题描述】:
似乎python3.5并没有完全释放任何已删除对象的内存,这可能是因为python内部维护了某种内存池以用于重用目的,但是,我不想重用它们,我想释放它们为在 linux 上运行的其他程序提供内存。
>>> psutil.Process().memory_info().rss / 2**20
11.47265625
>>> d = {x:x for x in range(10**7)}
>>> psutil.Process().memory_info().rss / 2**20
897.1796875
>>> del d
>>> gc.collect()
0
>>> psutil.Process().memory_info().rss / 2**20
15.5859375
这只是一个玩具示例,真正的问题是在一个正在运行的服务器上,占用了 20GB 的不可释放内存。
这是另一个例子:(wd1 是带有字符串键的 dict 的 dict)
>>> psutil.Process().memory_info().rss / 2**20
28.1796875
>>> wd1 = {x:{i:i for i in d} for x in k}
>>> psutil.Process().memory_info().rss / 2**20
682.78125
>>> del wd1
>>> psutil.Process().memory_info().rss / 2**20
186.21484375
【问题讨论】:
-
您无法控制 python(或任何其他具有自动或半自动内存管理的现代语言)中的内存管理。
-
当我们需要在服务器程序上使用python时,这真是一个问题,如何修改python3.5的源代码使其可以在服务器上使用?
-
只是一个想法,但是使用子进程或多进程模块来完成大块工作呢?一旦 Linux 进程终止,您不会恢复所有内存吗? 如何修改 python3.5 的源代码... 至少对我来说似乎是一个初学者。
-
哦,您可能还想查看 weakref 看看它是否适用于您的问题。
-
20GB 对于一些维护内存来说已经足够了。您应该显示获得“不可释放”内存的代码。您可能仍然保留对所有对象的引用。
标签: python python-3.x memory memory-management memory-leaks