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

本文探讨了如何在Python中通过子进程强制释放内存,特别是在处理大量整数列表后。创建子进程可以确保内存被释放并返回给系统,使用`multiprocessing`模块可以实现这一目标。示例展示了如何在子进程中创建和排序大型整数列表,然后释放相关内存。
摘要由CSDN通过智能技术生成

关于优化建议,重要的是确保my_function()只在子流程中调用。deepcopy和del是不相关的——一旦你在一个进程中创建了500万个不同的整数,同时保持所有整数,游戏就结束了。即使停止引用这些对象,Python也会通过将对500万个空整数对象大小的字段的引用保持在一个不确定的范围内来释放它们,在那里,这些字段等待下一个要创建500万个整数的函数重用。这是另一个答案中提到的free list,它盲目地购买了int和float的快速分配和释放。Python应该注意到这不是内存泄漏,因为内存肯定可以用于进一步的分配。但是,在进程结束之前,该内存不会返回到系统,也不会被重用,除非分配相同类型的数字。

大多数程序没有这个问题,因为大多数程序不会创建病态的庞大数字列表,释放它们,然后期望将该内存重新用于其他对象。使用numpy的程序也是安全的,因为numpy以紧密压缩的本机格式存储数组的数值数据。对于遵循这种使用模式的程序,减轻问题的方法是首先不要同时创建大量整数,至少在需要将内存返回到系统的过程中不要这样做。目前还不清楚您拥有什么样的用例,但是一个现实世界的解决方案可能需要的不仅仅是一个“魔法装饰器”。

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

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

def 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 - t0

if __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语句创建的类的实例。实施一个免费名单并不难,但它相当先进,而且很少没有充分的理由。如果某个扩展作者已选择对其类型之一使用自由列表,可以预期的是,他们意识到了自由列表所提供的折衷方案——以牺牲一些额外空间(用于自由列表上的对象和自由列表本身)和无法将内存重新用于其他用途为代价获得额外的快速分配/释放。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Python强制杀死子进程,可以使用不同的方法。以下是几种常见的方法: 1. 使用`os.kill()`函数:使用`os.kill()`函数可以向指定的进程发送信号,其中SIGKILL信号可以用来强制终止进程。可以使用`os.getpid()`函数获取当前脚本的进程ID,然后使用`os.kill()`函数发送SIGKILL信号来强制终止子进程。 2. 使用`subprocess.call()`函数:使用`subprocess.call()`函数可以执行系统命令,在Windows系统中,可以使用`taskkill.exe`命令来终止进程。可以使用`subprocess.call()`函数执行`taskkill.exe`命令,传递进程ID参数来强制终止子进程。 3. 使用`subprocess.run()`函数:使用`subprocess.run()`函数也可以执行系统命令,在Windows系统中,可以使用`taskkill.exe`命令来终止进程。可以使用`subprocess.run()`函数执行`taskkill.exe`命令,传递进程ID参数来强制终止子进程。 需要注意的是,强制终止进程可能会造成数据丢失或其他不可预料的后果,因此在使用这些方法之前,请确保你真正需要强制终止子进程。 总结起来,你可以使用`os.kill()`函数、`subprocess.call()`函数或`subprocess.run()`函数来强制终止Python中的子进程。具体的实现方法取决于你的需求和环境。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Python windows系统下强制杀死运行中的多进程脚本](https://blog.csdn.net/qq_38154948/article/details/131306610)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [python通过端口号杀死进程](https://blog.csdn.net/qq_43347021/article/details/131187718)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值