LINUX.ORG.RU

Получить гигабайты из вывода команды «free -m» (корректную устанволенную память)

 


0

2

Привет.

Через команду free -m мы получаем мегабайты. Необходимо округлить их до гигабайтов. Примеры:

1876 -> 2 GB	
7984 -> 8 GB
3952 -> 4 GB	
3951 -> 4 GB
8001 -> 8 GB
16047 -> 16 GB
32175 -> 32 GB
257825 -> 256 GB

Как это сделать корректно на python?

Если что, просто разделить и округлить нельзя:

>>> 1876/1024
1.8320312 -- OK, округляем до двух

>>> 257825/1024
251.7822265625 -- надо округлить до 256, а не до 252.

upd: P.S. dmidecode и другие варианты использовать нельзя. Заменять вывод free -m на что-то другое тоже.

Почему? Потому что я использую grains в salt-stack. И вводить свои грейнсы нежелательно.

★★★

Последнее исправление: iljuase (всего исправлений: 1)
Ответ на: комментарий от Deleted

Он округляет в меньшую сторону. Покажеь 252 вместо 256 и т.д.

P.S. dmidecode и другие варианты использовать нельзя. Заменять вывод free -m на что-то другое тоже.

Почему? Потому что я использую grains в salt-stack. И вводить свои грейнсы нежелательно.

iljuase ★★★
() автор топика
user@machine:~$ free -h
              total        used        free      shared  buff/cache   available
Память:        3,8G        2,2G        252M        223M        1,3G        1,1G
Подкачка:        2,0G         19M        2,0G

karmich
()

Дели, бери двоичный логарифм, округляй до целого, возвращай значение. Изи же. Или в змеюке нет двоичного логарифма?

robus ★★★★★
()
Ответ на: комментарий от Deleted

Тут главное не перепутать гибибайты и гигабайты. В недавней версии ключики изменили и -g может показать не то что ожидаешь.

entefeed ☆☆☆
()
Ответ на: комментарий от system-root

Нельзя использовать free -g. Можно только free -m. Это грйенсы salt, чтобы получить результат free -g, надо вводить доп. грейнсы, что нежелательно.

iljuase ★★★
() автор топика
Ответ на: комментарий от iljuase

Тогда объясни, по какому именно правилу округляешь. Почему 3Гб — валидно, а 252Гб — нет? Если только или степени 2, или ровно 3Гб, то ну ты понял, где ветвить и выпадать.

robus ★★★★★
()
Последнее исправление: robus (всего исправлений: 1)
Ответ на: комментарий от robus

ага. я тебя понял, спасибо. Это невозможно.

iljuase ★★★
() автор топика

У тебя странная логика округления, но выглядит так словно тебе нужно построить отрезки где концами будут числа до которых округлять (например 2048 и 3072) и смотреть на какой отрезок попал размер памяти и по смещению от центра определять в какую сторону округлять.

Конечно можно было бы без таких костылей, но у тебя есть правила вида

251.7822265625 — надо округлить до 256, а не до 252.

Dred ★★★★★
()
Последнее исправление: Dred (всего исправлений: 1)

Попробуй это

memory = 257825
nextPowerOfTwo = pow(2, math.ceil(math.log(memory,2)))
print(nexPowerOfTwo/1024) # 256

karmich
()
Последнее исправление: karmich (всего исправлений: 1)
Ответ на: комментарий от robus

Тут можно поправочку, но не проверял. Берешь логарифм. Берешь целую часть (не округляешь). Делишь на степень этой целой части. Его округляешь. =Результат * 2^целое.

anonymous
()
Ответ на: комментарий от anonymous

Логарифмы, экспоненты... Я тут подумал и мы решили, что это очень легко делается битовыми операциями.

anonymous
()
Ответ на: комментарий от anonymous

и получаем 4 вместо 3:

>>> pow(2, math.ceil(math.log(3007,2)))/1024
4.0

iljuase ★★★
() автор топика
Ответ на: комментарий от iljuase

Нельзя использовать free -g. Можно только free -m.

Значит костыль лепи

Siado ★★★★★
()
Ответ на: комментарий от Siado

Потому что скрипт уже используется пару лет и перетаскивать всё с salt на что-то другое нежелательно.

iljuase ★★★
() автор топика

Необходимо округлить их до гигабайтов.

Ты объясни логику округления. Почему 252GB можно округлить до 256GB накинув 4GB. А 3GB до 4GB округлить нельзя? Вот возьмем 130GB, по твоей логике надо до 128GB округлять или до 256GB? Я что-то вообще логики не вижу.

V1KT0P ★★
()
Ответ на: комментарий от V1KT0P

Он не сможет объяснить. А логика, скорее всего, следующая: оставить N первых страших бит и двоично округлить оставшуюся часть. Осталось узнать чему равно N, но он не признается.

anonymous
()

Захардкодить халяльные значения и округлять до них уже предлагали? Хотя ересь конечно

MrClon ★★★★★
()
Ответ на: комментарий от V1KT0P

Вверх обычно округляется от 0.5. Обычная логика же, ему надо floor, значит 130 округляем до 4.

Построй себе дерево ифов, если очень надо, для кейсов меньше 8 вверх, больше вниз. (мне нравится как ты 15699 собираешься до 8 округлить)

anonymous
()
Ответ на: комментарий от V1KT0P

Вангую что ТС хочет получить суммарный номинальный объём установленных плашек, но отчаянно не хочет получать его суммированием номинальных объёмов плашек

MrClon ★★★★★
()
Ответ на: комментарий от anonymous

Жесть я расписал. N - это точность (количество бит) мантисы. А число надо предстваить в экспоненцальной форме, ественно в двоичной.

anonymous
()

Шел писать комментарий про dmidecode, а ТС сразу обломал.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от MrClon

Вообще-то free -m в колонке Total не показывает суммарный объем планок, а странное значение, которое исключает, по-видимому, некоторое количество адресов зарезервированных биосом и устройствами. Так что как ни округляй, «правильного» объема планок не получишь

unanimous ★★★★★
()
Ответ на: комментарий от unanimous

Это как-раз не проблема, зажатая ядром память много меньше суммарного её объёма

MrClon ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.