频繁返回Python集合致内存占用过高,如何释放内存?
集合返回函数的内存占用与释放问题
我有一个返回集合的函数,频繁调用它会导致内存占用过高。删除存储返回集合的列表后,内存并未得到释放;而当函数返回列表时,内存消耗低得多,且删除存储返回列表的列表后内存会被释放。
测试代码
import sys large_list = list(range(2_000_000)) def some_function(arg1, arg2=None): # return list(range(23)) # --> 内存占用: ~650 MB return set(list(range(23))) # --> 内存占用: ~4 GB results = [] for x in large_list: results.append(some_function(x)) print(f"size results: {sys.getsizeof(results)/1000/1000} MB") # >>> size results: 17.12828 MB del results # 使用集合时,此操作不会降低进程内存
删除results后再次执行for循环,内存占用并未升至~8GB,可见集合占用的内存似乎会被复用。
如果必须使用集合,我该如何释放内存?我的Python程序曾因内存不足崩溃。
我使用的是Linux系统(Rocky 9.2),通过btop查看进程内存占用。
编辑补充
- @Ashwini Chaudhari:单独执行
del语句时,我能立即看到内存下降(无需显式调用垃圾回收器),但那部分约4GB的大内存块并未释放。 - @Klaus D.:这只是示例,实际中
some_function会进行一些计算后返回集合,我遇到内存问题后将该问题单独隔离出来。 - @testfile:但我将函数返回的列表添加到一个列表中时,使用集合时该列表并未占用全部内存,且列表的id也各不相同:
补充测试代码
def some_function(arg1, arg2=None): return list(range(23)) # --> 内存占用: ~650 MB results = [] for x in range(2): results.append(some_function(x)) print(f"id r: {id(results)}") print(f"id r[0]: {id(results[0])}") print(f"id r[1]: {id(results[1])}")
输出结果
id r: 140151027880896 id r[0]: 140151027733120 id r[1]: 140151027735040
- 编辑2:查看我的回答。
- 编辑3:已将编辑2发布为回答。
内容的提问来源于stack exchange,提问作者s-homberg
相关产品推荐
相关产品推荐

