Определение свободного ОЗУ в Python

Я хотел бы, чтобы мой скрипт python использовал всю доступную бесплатную ОЗУ, но не более (по соображениям эффективности). Я могу контролировать это, читая только ограниченное количество данных, но мне нужно знать, сколько ОЗУ свободно во время выполнения, чтобы получить это право. Он будет работать на различных системах Linux. Можно ли определить свободную ОЗУ во время выполнения?

4 ответов


вы могли бы просто зачитать /proc/meminfo. Имейте в виду, что" свободная память " обычно довольно низкая, так как ОС сильно использует свободную неиспользуемую память для кэширования.

кроме того, лучше, если вы не пытаетесь перехитрить управление памятью вашей ОС. Обычно это заканчивается слезами (или медленными программами). Лучше просто возьмите RAM, который вам нужен. Если вы хотите использовать как можно больше на машине с ранее неизвестным объемом памяти, я бы, вероятно, проверил, сколько ОЗУ установлено (MemTotal на /proc/meminfo), оставьте определенную сумму для ОС и в качестве запаса безопасности (скажем, 1 ГБ) и используйте остальное.


в 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

вы можете запустить это при запуске скрипта. ОЗУ обычно используется и освобождается довольно часто в занятой системе, поэтому вы должны учитывать это, прежде чем решать, сколько ОЗУ использовать. Кроме того, большинство систем linux имеют значение swappiness 60. При использовании памяти наименее часто используемые страницы будут заменены. Вы можете использовать SWAP вместо RAM.

надеюсь, что это помогает.


Так как оригинальный плакат написал код должен работать на различных Linux system, я размещаю здесь объектно-ориентированное решение для запроса памяти 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

код:

class FreeMemLinux(object):
    """
    Non-cross platform way to get free memory on Linux. Note that this code
    uses the `with ... as`, which is conditionally Python 2.5 compatible!
    If for some reason you still have Python 2.5 on your system add in the
head of your code, before all imports:
    from __future__ import with_statement
    """

    def __init__(self, unit='kB'):

        with open('/proc/meminfo', 'r') as mem:
            lines = mem.readlines()

        self._tot = int(lines[0].split()[1])
        self._free = int(lines[1].split()[1])
        self._buff = int(lines[2].split()[1])
        self._cached = int(lines[3].split()[1])
        self._shared = int(lines[20].split()[1])
        self._swapt = int(lines[14].split()[1])
        self._swapf = int(lines[15].split()[1])
        self._swapu = self._swapt - self._swapf

        self.unit = unit
        self._convert = self._factor()

    def _factor(self):
        """determine the convertion factor"""
        if self.unit == 'kB':
            return 1
        if self.unit == 'k':
            return 1024.0
        if self.unit == 'MB':
            return 1/1024.0
        if self.unit == 'GB':
            return 1/1024.0/1024.0
        if self.unit == '%':
            return 1.0/self._tot
        else:
            raise Exception("Unit not understood")

    @property
    def total(self):
        return self._convert * self._tot

    @property
    def used(self):
        return self._convert * (self._tot - self._free)

    @property
    def used_real(self):
        """memory used which is not cache or buffers"""
        return self._convert * (self._tot - self._free -
                                self._buff - self._cached)

    @property
    def shared(self):
        return self._convert * (self._tot - self._free)

    @property
    def buffers(self):
        return self._convert * (self._buff)

    @property
    def cached(self):
        return self._convert * self._cached

    @property
    def user_free(self):
        """This is the free memory available for the user"""
        return self._convert *(self._free + self._buff + self._cached)

    @property
    def swap(self):
        return self._convert * self._swapt

    @property
    def swap_free(self):
        return self._convert * self._swapf

    @property
    def swap_used(self):
        return self._convert * self._swapu

Я полагаю, вы могли бы использовать свободный (http://www.cyberciti.biz/faq/linux-check-memory-usage/), ps или, может быть,MemoryMonitor класс из SO-потока, размещенного в самом низу моего ответа, чтобы сделать это. Просто сократите слабину и оставьте небольшое количество ОЗУ неиспользуемым для других процессов, если им это срочно понадобится.

вам нужно будет проанализировать вывод из free или ps, Если вы используй это, но это не должно быть сложно. Помните, что вам нужно проанализировать доступную оперативную память в реальном времени, чтобы вы могли настроить, если другой процесс по какой-то причине проголодается.

Также см. эту ветку: как получить текущее использование процессора и ОЗУ в Python?