如何使用子进程强制python释放内存?

如何使用子进程强制python释放内存?,第1张

如何使用子进程强制python释放内存

关于优化建议的重要事项是确保

my_function()
仅在子流程中调用该建议。该
deepcopy
del
是无关的-
一旦你在过程中创造500万个不同的整数,抓着他们都在同一时间,它的比赛结束了。即使您停止引用这些对象,Python也会通过在静态状态下保留对500万个空整数对象大小的字段的引用来释放它们,以等待它们重用于下一个要创建500万个整数的函数。这是
免费清单
在另一个答案中提到,它购买了int和float的快速分配和释放。对于Python来说公平的是,这并不是内存泄漏,因为内存肯定可以用于进一步的分配。但是,该内存将在处理结束之前不会返回给系统,也不会重用于分配相同类型的数字。


大多数程序都不会出现此问题,因为大多数程序不会创建病理上庞大的数字列表,不会释放它们,然后期望将该内存重新用于其他对象。使用程序

numpy
也是安全的,因为
numpy
以紧密包装的本机格式存储其数组的数字数据。对于确实遵循这种使用模式的程序,减轻问题的方法是首先不要同时创建大量整数,至少不需要在需要将内存返回给系统的过程中创建大量整数。目前尚不清楚您拥有的确切用例,但实际解决方案可能需要的不仅仅是“魔术装饰器”。

这是子进程进入的地方:如果数字列表是在另一个进程中创建的,那么与该列表关联的所有内存(包括但不限于int的存储)都可以通过终止 *** 作而被释放并返回给系统。子流程。当然,您必须设计程序,以便可以在子系统中创建和处理列表,而无需传输所有这些数字。子流程可以接收创建数据集所需的信息,并且可以将通过处理列表获得的信息发回。

为了说明原理,让我们升级示例,以便实际上需要存在整个列表-
假设我们正在对排序算法进行基准测试。我们要创建一个庞大的整数列表,对其进行排序,并可靠地释放与该列表关联的内存,以便下一个基准测试可以根据自己的需求分配内存,而不必担心RAM不足。要生成子流程并进行通信,将使用以下

multiprocessing
模块:

# To run this, save it to a file that looks like a valid Python module, e.g.# "foo.py" - multiprocessing requires being able to import the main module.# Then run it with "python foo.py".import multiprocessing, random, sys, os, timedef create_list(size):    # utility function for clarity - runs in subprocess    maxint = sys.maxint    randrange = random.randrange    return [randrange(maxint) for i in xrange(size)]def run_test(state):    # this function is run in a separate process    size = state['list_size']    print 'creating a list with %d random elements - this can take a while... ' % size,    sys.stdout.flush()    lst = create_list(size)    print 'done'    t0 = time.time()    lst.sort()    t1 = time.time()    state['time'] = t1 - t0if __name__ == '__main__':    manager = multiprocessing.Manager()    state = manager.dict(list_size=5*1000*1000)  # shared state    p = multiprocessing.Process(target=run_test, args=(state,))    p.start()    p.join()    print 'time to sort: %.3f' % state['time']    print 'my PID is %d, sleeping for a minute...' % os.getpid()    time.sleep(60)    # at this point you can inspect the running process to see that it    # does not consume excess memory
奖励答案

由于红利问题不清楚,因此很难提供答案。“自由列表概念”正是一个概念,一种实现策略,需要在常规Python分配器之上显式编码。大多数Python类型 都不
使用该分配策略,例如,该

class
语句不用于使用该语句创建的类的实例。实施免费名单并不难,但是它相当先进,很少出于没有正当理由而进行。如果某个扩展作者
选择使用免费列表作为其类型之一,可以预期他们知道免费列表提供的折衷方案-
以一些额外的空间为代价获得超快的分配/重新分配(对于免费列表中的对象)以及空闲列表本身),并且无法将内存用于其他用途。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/zaji/5630285.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存