如何将内存从Python释放回OS?

2024-09-29 23:16:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有类似的代码:

def memoryIntensiveFunction(x):
    largeTempVariable = Intermediate(x)
    processFunction(largeTempVariable,x)

问题是变量temp在我的测试用例中大约是500MB,但是当memoryIntensiveFunction完成时,这个空间并没有返回给操作系统。我知道这一点是因为使用guppy工具的内存分析表明largeTempVariable已释放(即,在Python中),但是{}显示没有释放。我想我看到的是{a1}描述的效果。问题是这个进程运行很长时间(即几个小时),memoryIntensiveFunction是在开始运行的,再也不会运行了,所以让我不得不携带500mb的内存数小时是不方便的。在

我发现here和{a3}的一个解决方案建议使用单独的进程。多处理会产生自己的成本,但在我的案例中它是值得的。但是,这将需要重构memoryIntensiveFunction调用方以接收x作为返回值,而不是看到它被适当地修改。真正的杀手是我的对象x不可选择(它大量使用了boostpython扩展)。要使x可拾取,需要做大量的工作。在

有没有我不考虑的选择?在


Tags: 工具内存代码进程def空间测试用例temp
1条回答
网友
1楼 · 发布于 2024-09-29 23:16:36

这似乎很奇怪,我试图重现你的问题,似乎简单的“del”就足够了。 要演示,可以运行以下代码:

import itertools
import pdb

def test():
    a = "a"
    for _ in itertools.repeat(None, 30):
        a += a
    pdb.set_trace()
    del a
    pdb.set_trace()

test()

在第一个断点处,您将看到它使用了大约1gb的ram(您需要python3.3条目):

^{pr2}$

在第二个断点处,删除变量后,内存被释放:

 Private  +   Shared  =  RAM used       Program

  4.0 KiB +   9.0 KiB =  13.0 KiB       VisualGDB-DisownTTY-r1
  4.0 KiB +  15.0 KiB =  19.0 KiB       sharing-tests
  4.0 KiB +  19.5 KiB =  23.5 KiB       dhcpcd
  4.0 KiB +  31.5 KiB =  35.5 KiB       gdb
  4.0 KiB +  36.0 KiB =  40.0 KiB       vim [deleted]
  4.0 KiB +  38.0 KiB =  42.0 KiB       systemd-udevd
 40.0 KiB +  10.0 KiB =  50.0 KiB       init
 24.0 KiB + 135.0 KiB = 159.0 KiB       agetty (6)
 12.0 KiB + 150.0 KiB = 162.0 KiB       su (3)
 88.0 KiB + 103.0 KiB = 191.0 KiB       syslog-ng (2)
152.0 KiB +  55.0 KiB = 207.0 KiB       crond
172.0 KiB +  81.0 KiB = 253.0 KiB       python3.4
584.0 KiB + 220.5 KiB = 804.5 KiB       sshd (3)
768.0 KiB + 928.0 KiB =   1.7 MiB       bash (13)
  2.8 MiB + 118.0 KiB =   2.9 MiB       mongod
  5.1 MiB +   1.2 MiB =   6.3 MiB       python3.3
  7.4 MiB + 109.0 KiB =   7.5 MiB       tmux [deleted] (2)
                -
                         20.3 MiB
=================================

现在,如果我们删除“del”from函数,并在test()之后设置断点:

import itertools
import pdb

def test():
    a = "a"
    for _ in itertools.repeat(None, 30):
        a += a
    pdb.set_trace()

test()
pdb.set_trace()

在我们终止之前,内存确实不会被释放:

 Private  +   Shared  =  RAM used       Program

  4.0 KiB +   9.0 KiB =  13.0 KiB       VisualGDB-DisownTTY-r1
  4.0 KiB +  15.0 KiB =  19.0 KiB       sharing-tests
  4.0 KiB +  19.5 KiB =  23.5 KiB       dhcpcd
  4.0 KiB +  31.5 KiB =  35.5 KiB       gdb
  4.0 KiB +  36.0 KiB =  40.0 KiB       vim [deleted]
  4.0 KiB +  38.0 KiB =  42.0 KiB       systemd-udevd
 40.0 KiB +  10.0 KiB =  50.0 KiB       init
 24.0 KiB + 135.0 KiB = 159.0 KiB       agetty (6)
 12.0 KiB + 150.0 KiB = 162.0 KiB       su (3)
160.0 KiB +  53.0 KiB = 213.0 KiB       crond
172.0 KiB +  81.0 KiB = 253.0 KiB       python3.4
628.0 KiB + 219.5 KiB = 847.5 KiB       sshd (3)
836.0 KiB + 152.0 KiB = 988.0 KiB       syslog-ng (2)
752.0 KiB + 957.0 KiB =   1.7 MiB       bash (13)
  2.8 MiB + 113.0 KiB =   2.9 MiB       mongod
  7.4 MiB + 108.0 KiB =   7.6 MiB       tmux [deleted] (2)
  1.0 GiB +   1.1 MiB =   1.0 GiB       python3.3
                -
                          1.0 GiB
=================================

那么我的建议呢?使用完吸盘后,请将其删除,不再需要;)

相关问题 更多 >

    热门问题