【问题标题】:Free memory in PythonPython中的空闲内存
【发布时间】:2018-06-06 03:28:21
【问题描述】:

如何在 python 中释放列表的部分内存? 我可以通过以下方式进行吗:

del list[0:j]  

或者对于单个列表节点:

del list[j] 

Mark:我的脚本分析大量列表并创建大量输出,这就是我需要立即释放内存的原因。

【问题讨论】:

  • 第一个将从list 中删除第一个j 项目。第二个将删除第 j+1 个项目。
  • 您到底想完成什么?
  • 也许你最好使用生成器来创建一个管道来执行你想要的过滤?
  • @ThijsvanDien 您能否提供有关您提到的方法的更多信息?也许我必须为此打开另一个线程?
  • 为此,您需要更具体地展示您正在做什么来生成列表以及如何处理它们。例如,一个重要因素是,是否可以孤立地考虑元素,或者是否可以根据它们之前或之后的元素做出决策。

标签: python memory memory-management out-of-memory dealloc


【解决方案1】:

您不能真正在 Python 中手动释放内存。

使用del 会减少对象的引用计数。一旦引用计数达到零,垃圾收集器运行时对象将被释放。

所以你能做的最好的就是在del-ing 一堆对象之后手动运行gc.collect()


在这些情况下,最好的建议通常是尝试更改您的算法。例如,使用生成器而不是 Thijs 在 cmets 中建议的列表。

另一种策略是解决问题(购买更多 RAM)。但这通常具有财务和技术限制。 :-)

【讨论】:

    【解决方案2】:

    您可以通过四种流行的方法(包括collections.deque)删除列表中的项目:

    列出 remove() 方法:

    remove 删除第一个匹配值,而不是特定索引

    记住此方法不返回任何值,而是从列表中删除给定的对象。

    示例:

    list_1 = [987, 'abc', 'total', 'cpython', 'abc'];
    list_1.remove('abc')
    print(list_1)
    list_1.remove('total')
    print(list_1)
    

    输出:

    [987, 'total', 'cpython', 'abc']
    [987, 'cpython', 'abc']
    

    第二种方法是list del()方法

    你必须在这里指定 index_no

    list_1 = [987, 'abc', 'total', 'cpython', 'abc'];
    del list_1[1]
    print(list_1)
    del list_1[-1:]
    print(list_1)
    

    输出:

    [987, 'total', 'cpython', 'abc']
    [987, 'total', 'cpython']
    

    第三个是 list pop() 方法:

    pop() 删除并返回列表中的最后一项。

    list_1 = [987, 'abc', 'total', 'cpython', 'abc'];
    list_1.pop()
    print(list_1)
    list_1.pop()
    print(list_1)
    list_1.pop()
    print(list_1)
    

    输出:

    [987, 'abc', 'total', 'cpython']
    [987, 'abc', 'total']
    [987, 'abc']
    

    第四个方法是 collections.deque

    还有一些外部模块方法,例如:

    您可以从双端队列的两侧弹出值:

    from collections import deque
    
    d = deque()
    
    d.append('1')
    d.append('2')
    d.append('3')
    print(d)
    
    d.popleft()
    print(d)
    d.append('1')
    print(d)
    
    d.pop()
    print(d)
    

    输出:

    deque(['1', '2', '3'])
    deque(['2', '3'])
    deque(['2', '3', '1'])
    deque(['2', '3'])
    

    【讨论】:

    • 所有指定的方法都释放内存吗?我在问,因为我的脚本分析了巨大的列表并创建了巨大的输出,这就是为什么我必须确保在运行时释放。
    • @David deque 会,因为它本质上是一个链表。常规列表在内存中是连续的,并且仅在其元素数量减半或加倍(粗略估计)时才会重新分配。在此之前,内存使用量保持不变。更糟糕的是,重新分配操作本身需要与新列表一样多的内存,因为旧列表在被复制之前无法清理。请注意,链表也不理想。例如,它需要每个元素更多的内存,并且索引操作的成本相对较高。
    猜你喜欢
    • 2012-09-18
    • 1970-01-01
    • 2018-08-21
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 2014-04-06
    • 2021-02-27
    相关资源
    最近更新 更多