python - 如何释放python删除对象的内存?

标签 python python-3.x memory memory-management memory-leaks

似乎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

最佳答案

一旦你删除了一个对象,它就可以被垃圾回收而不是立即删除——所以只要给它一些时间,它就会释放或触发 gc.collect() 来加快处理速度。

python.exe
Python 3.5.1 (v3.5.1:37a07cee5969, Dec  6 2015, 01:38:48) [MSC v.1900 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import psutil
>>> import gc
>>> psutil.Process().memory_info().rss / 2**20
13.2890625
>>> d = {x:x for x in range(10**7)}
>>> psutil.Process().memory_info().rss / 2**20
359.13671875
>>> del d
>>> psutil.Process().memory_info().rss / 2**20
13.5234375
>>> gc.collect()
0
>>> psutil.Process().memory_info().rss / 2**20
13.4375
>>>

仅供引用,Python 3 shell实际上更像ipython 2,其中有一定数量的存储占用历史等,仅供引用:

Python 3.5.1 (v3.5.1:37a07cee5969, Dec  6 2015, 01:38:48) [MSC v.1900 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import psutil
>>> psutil.Process().memory_info().rss / 2**20
13.1875
>>> psutil.Process().memory_info().rss / 2**20
13.20703125
>>> psutil.Process().memory_info().rss / 2**20
13.20703125
>>> psutil.Process().memory_info().rss / 2**20
13.20703125
>>> psutil.Process().memory_info().rss / 2**20
13.20703125
>>> 22*3
66
>>> psutil.Process().memory_info().rss / 2**20
13.25390625
>>> import gc
>>> psutil.Process().memory_info().rss / 2**20
13.25390625
>>> gc.collect()
0
>>> psutil.Process().memory_info().rss / 2**20
13.171875
>>>

第二天早上检查函数中的字典更新是否不同:

>>> psutil.Process().memory_info().rss / 2**20
13.1484375
>>> D = {}
>>> psutil.Process().memory_info().rss / 2**20
13.1484375
>>> def UpdateD(d, v):
...     """ Add the text and value for v to dict d """
...     d[v] = str(v)
...
>>> psutil.Process().memory_info().rss / 2**20
13.16015625
>>> for x in range(10**7):
...     UpdateD(D, x)
...
>>> psutil.Process().memory_info().rss / 2**20
666.6328125
>>> del D
>>> psutil.Process().memory_info().rss / 2**20
10.765625
>>> gc.collect()
0
>>> psutil.Process().memory_info().rss / 2**20
12.8984375
>>>

所以看起来您的生产代码可能会卡在您仍然需要追踪的引用上。

关于python - 如何释放python删除对象的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38545463/

相关文章:

python - 使用 Colormaps 在 matplotlib 中设置线条的颜色

python - win.blit()后台pygame时出现滞后

javascript - 为什么这个 javascript 代码使浏览器占用 50% 的 CPU 和这么多内存?

c++ - 我可以更改 CPU 模式以读取内存吗?

python - ValueError : Input contains NaN, 无穷大或值对于 dtype 来说太大

python - 在数据框列中应用模糊匹配并将结果保存在新列中

python - 在 Python 中调用父类(super class)的类方法

python - 相对导入在 Python 中不起作用

python-3.x - 如何在特定序列第一次出现之前识别序列和索引号

Java内存: Runtime. getRuntime().maxMemory()