确定Python中的可用RAM

确定Python中的可用RAM,python,memory-management,Python,Memory Management,我想让我的python脚本使用所有可用的空闲RAM,但不要更多(出于效率原因)。我可以通过只读取有限数量的数据来控制这一点,但我需要知道在运行时有多少RAM是空闲的,以便正确地执行此操作。它将在各种Linux系统上运行。有可能在运行时确定可用RAM吗?我想您可以使用free()、ps或者我答案底部发布的SO线程中的MemoryMonitor类来实现这一点。如果其他进程迫切需要,只需减少一些空闲时间,并留下少量ram用于其他进程,以避免磁盘写入 如果使用free或ps,则需要解析其输出,但这并不难

我想让我的python脚本使用所有可用的空闲RAM,但不要更多(出于效率原因)。我可以通过只读取有限数量的数据来控制这一点,但我需要知道在运行时有多少RAM是空闲的,以便正确地执行此操作。它将在各种Linux系统上运行。有可能在运行时确定可用RAM吗?

我想您可以使用free()、ps或者我答案底部发布的SO线程中的MemoryMonitor类来实现这一点。如果其他进程迫切需要,只需减少一些空闲时间,并留下少量ram用于其他进程,以避免磁盘写入

如果使用free或ps,则需要解析其输出,但这并不难。请记住,您需要实时分析可用的ram,以便在另一个进程由于某种原因导致内存不足时进行调整

另请参见此线程:

在Linux系统上,我经常使用这个:

def memory():
    """
    Get node total memory and memory usage
    """
    with open('/proc/meminfo', 'r') as mem:
        ret = {}
        tmp = 0
        for i in mem:
            sline = i.split()
            if str(sline[0]) == 'MemTotal:':
                ret['total'] = int(sline[1])
            elif str(sline[0]) in ('MemFree:', 'Buffers:', 'Cached:'):
                tmp += int(sline[1])
        ret['free'] = tmp
        ret['used'] = int(ret['total']) - int(ret['free'])
    return ret
您可以在脚本启动时运行此操作。RAM通常在繁忙的系统上使用和释放得非常频繁,所以在决定使用多少RAM之前,您应该考虑到这一点。此外,大多数linux系统的交换性值为60。内存用完时,使用频率最低的页面将被调出。您可能会发现自己使用的是SWAP而不是RAM


希望这有帮助。

您可以直接读出
/proc/meminfo
。请注意,“空闲内存”通常很低,因为操作系统大量使用空闲、未使用的内存进行缓存


此外,最好不要试图智取操作系统的内存管理。这通常以眼泪(或较慢的程序)结束。最好拿着你需要的公羊。如果您想在一台内存量未知的机器上尽可能多地使用内存,我可能会检查安装了多少RAM(
/proc/meminfo
中的
MemTotal
),为操作系统和安全裕度留有一定量(比如1GB)使用剩下的。

因为最初的海报写的代码应该在各种Linux系统上运行,所以我在这里发布了一个面向对象的Linux内存查询解决方案psutil是一个很棒的库,但是如果由于某种原因无法安装它,您只需使用以下解决方案即可:

用法示例:

>>> f = FreeMemLinux()
>>> print f.total, f.used,  f.user_free
8029212 3765960 4464816
>>>
>>> f_mb = FreeMemLinux(unit='MB')
>>> print f_mb.total, f_mb.used,  f_mb.user_free
7841.02734375 3677.6953125 4360.171875
>>>
>>> f_percent = FreeMemLinux(unit='%')
>>> print f_percent.total, f_percent.used, f_percent.user_free
100.0 46.9032328453 55.60715049
代码:


另一个选项是内置的Python包
psutil

stats = psutil.virtual_memory()  # returns a named tuple
available = getattr(stats, 'available')
print(available)
根据,
可用
字段“是通过根据平台对不同内存值求和来计算的,它应该用于跨平台监测实际内存使用情况。”


注意返回值将以字节为单位

交换值60意味着什么?@marshall给出了一个公平的解释。这是内核交换页面的可能性。值的范围从0到100,其中0最不可能调出(通常这样做是为了避免内存不足的情况),而100是积极的调出。一些*nix系统没有/proc:(@nic
/proc/meminfo
及其当前的一组值。这应该足够长。除了Linux之外,还有其他*nix系统,因此为了通用性的目的,这一点值得一提。OP指定它将在各种Linux系统上运行。是的。也许出于兴趣,我们可以同意将我的评论视为奇珍异宝d读取器?:)它是内置的Python包吗?
stats = psutil.virtual_memory()  # returns a named tuple
available = getattr(stats, 'available')
print(available)