Source code for mantidimaging.core.utility.memory_usage
# Copyright (C) 2022 ISIS Rutherford Appleton Laboratory UKRI
# SPDX - License - Identifier: GPL-3.0-or-later
from logging import getLogger
# Percent memory of the system total to AVOID being allocated by Mantid Imaging shared arrays
# as taking up nearly, if not exactly, 100% not only makes it more likely to get hit by
# SIGBUS by the OS, but even if the allocation is permitted it could slow the system down
# to the point of being unusable
MEMORY_CAP_PERCENTAGE = 0.025
[docs]
def system_free_memory():
class Value:
def __init__(self, bytes):
self._bytes = bytes
def kb(self):
return self._bytes / 1024
def mb(self):
return self._bytes / 1024 / 1024
import psutil
meminfo = psutil.virtual_memory()
return Value(meminfo.available - meminfo.total * MEMORY_CAP_PERCENTAGE)
[docs]
def get_memory_usage_linux(kb=False, mb=False):
"""
:param kb: Return the value in Kilobytes
:param mb: Return the value in Megabytes
"""
import psutil
meminfo = psutil.virtual_memory()
tuple_to_return = tuple() # start with empty tuple
# meminfo.used gives the size in bytes
if kb:
tuple_to_return += (meminfo.used / 1024, )
if mb:
tuple_to_return += (meminfo.used / 1024 / 1024, )
return tuple_to_return
[docs]
def get_memory_usage_linux_str():
memory_in_kbs, memory_in_mbs = get_memory_usage_linux(kb=True, mb=True)
# handle caching
memory_string = "{0} KB, {1} MB".format(memory_in_kbs, memory_in_mbs)
# use an attribute to this function only, instead a global variable visible
# outside
if not hasattr(get_memory_usage_linux_str, 'last_memory_cache'):
get_memory_usage_linux_str.last_memory_cache = memory_in_kbs
else:
# get memory difference in Megabytes
delta_memory = (
memory_in_kbs - get_memory_usage_linux_str.last_memory_cache) \
/ 1024
# remove cached memory, del removes the reference so that hasattr will
# work correctly
del get_memory_usage_linux_str.last_memory_cache
memory_string += ". Memory change: {0} MB".format(delta_memory)
return memory_string
[docs]
def debug_log_memory_usage_linux(message=""):
try:
# Windows doesn't seem to have resource package, so this will
# silently fail
import resource as res
log = getLogger(__name__)
log.info("Memory usage {} KB, {} MB".format(
res.getrusage(res.RUSAGE_SELF).ru_maxrss,
int(res.getrusage(res.RUSAGE_SELF).ru_maxrss) / 1024))
log.info(message)
except ImportError:
log.warning('Resource monitoring is not available on Windows')