【问题标题】:Method to free/reset RAM in Python在 Python 中释放/重置 RAM 的方法
【发布时间】:2023-02-01 19:40:55
【问题描述】:

我正在努力寻找一种在 Python 中实际释放 RAM 的方法。 通过使用 htop 监控其使用情况,我尝试释放 RAM 空间,但通常的 delgc.collect() 不起作用。 这是在非常复杂的代码(函数、库、方法……)的上下文中。

所以,我决定写一个非常简单的脚本,在htop上监控的同时测试一下:

import numpy as np
import gc

y = []
for i in range(10000):
   y.append( np.zeros( 1000 )  )

del y
g.collect()
%reset -f

即使在 %reset -f 之后,RAM 也没有被释放。 释放它的唯一方法是在 ipython 控制台中执行exit

是否有实际释放 RAM 的命令?

【问题讨论】:

  • 将内存还给操作系统并不总是微不足道或不可能的。对此有很多疑问,但往往没有确凿的答案。至少知道在 Python 请求新内存之前内存将被重用。

标签: python garbage-collection ipython ram


【解决方案1】:

在您的脚本中,您正在创建一个 numpy 数组列表,这会消耗大量内存。当您使用“del y”删除列表时,内存被标记为可用,但内存管理器不会立即将其释放回操作系统。

在 Python 中,内存不会立即释放回操作系统,而是保存在缓存中,以便再次需要时可以快速重用。这就是为什么 Python 被认为是内存友好语言的原因之一。

您可以使用“gc.collect()”函数强制进行垃圾回收,这可以释放不再需要的内存。但是,在您的情况下,这似乎不足以释放所有内存。

一种可能的解决方案是使用内存映射文件,它允许您访问存储在磁盘上的数据,就好像它在内存中一样。如果您需要在内存中存储大量数据,并且数据太大而无法放入内存,这可能是一个很好的解决方案。以下是如何使用内存映射文件存储数据的示例:

import numpy as np
import os
import mmap

f = os.open('data.bin', os.O_CREAT | os.O_TRUNC | os.O_RDWR)

# resize the file to hold the data
os.truncate(f, 10000 * 1000 * 4)

# memory-map the file
y = np.memmap('data.bin', dtype='float32', mode='w+', shape=(10000, 1000))

for i in range(10000):
   y[i] = np.zeros(1000)

del y
os.close(f)

通过这种方式,您可以将数据存储在磁盘上的文件中,并像在内存中一样访问它,这可以帮助您减少内存使用量,并释放不再需要的内存。

请注意,内存映射文件可能比普通数组慢,因为访问磁盘上的数据比访问内存中的数据慢。但是,如果您需要减少内存使用量,并且您的数据太大而无法放入内存,这可能是一个很好的解决方案。

【讨论】:

    猜你喜欢
    • 2018-08-20
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    相关资源
    最近更新 更多