memory.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import re
  2. import math
  3. def get_total_memory():
  4. with open("/proc/meminfo") as f:
  5. for line in filter(lambda x: "MemTotal" in x, f):
  6. return int(line.split()[1]) * 1024
  7. return 0
  8. TOTAL_MEM = get_total_memory()
  9. SINGLE_SUFFIX_REGEX = re.compile(r"^[1-9][0-9]*([EPTGMK])$")
  10. DOUBLE_SUFFIX_REGEX = re.compile(r"^[1-9][0-9]*([EPTGMK])i$")
  11. BYTES_INTEGER_REGEX = re.compile(r"^[1-9][0-9]*$")
  12. EXPONENT_REGEX = re.compile(r"^[1-9][0-9]*e[0-9]+$")
  13. SUFFIX_MULTIPLIERS = {
  14. "K": 10**3,
  15. "M": 10**6,
  16. "G": 10**9,
  17. "T": 10**12,
  18. "P": 10**15,
  19. "E": 10**18,
  20. }
  21. DOUBLE_SUFFIX_MULTIPLIERS = {
  22. "Ki": 2**10,
  23. "Mi": 2**20,
  24. "Gi": 2**30,
  25. "Ti": 2**40,
  26. "Pi": 2**50,
  27. "Ei": 2**60,
  28. }
  29. def transform_memory(memory):
  30. result = 4096 # Default to 4GB
  31. if re.match(SINGLE_SUFFIX_REGEX, memory):
  32. suffix = memory[-1]
  33. result = int(memory[:-1]) * SUFFIX_MULTIPLIERS[suffix]
  34. elif re.match(DOUBLE_SUFFIX_REGEX, memory):
  35. suffix = memory[-2:]
  36. result = int(memory[:-2]) * DOUBLE_SUFFIX_MULTIPLIERS[suffix]
  37. elif re.match(BYTES_INTEGER_REGEX, memory):
  38. result = int(memory)
  39. elif re.match(EXPONENT_REGEX, memory):
  40. result = int(float(memory))
  41. result = math.ceil(result)
  42. result = min(result, TOTAL_MEM)
  43. # Convert to Megabytes
  44. result = result / 1024 / 1024
  45. if int(result) == 0:
  46. result = TOTAL_MEM if TOTAL_MEM else 4096
  47. return int(result)