Perl модул за конвертиране между MB/GB/TB без първо конвертиране в байтове?

Опитвам се да изчисля свободното пространство на физически том на LVM, като умножа броя на свободните физически екстенти по размера на екстента, например:

3623365 free extents * 4.00 MB each = 13.8 TB

Използвах Number::Format за конвертиране на размера на екстента в байтове и преобразувайте резултатите от умножението обратно в четим от човека низ, но TB и по-високи не се поддържат, така че завършвам с по-дългия, по-малко четим 14,153.8 GB.

Според документите причината, поради която TB и нагоре не се поддържат, е поради целочислено препълване на 32-битови системи, което ме накара да се чудя дали изобщо трябва да умножавам произволно големи числа, без да използвам нещо като Math::BigInt. Виждам, че Number::Bytes::Human поддържа числа до YB (йотабайта), но все още е в алфа версия, така че се колебая да го използвам в производствен код.

Следващата ми мисъл беше, защо изобщо да конвертирам в байтове, когато мога да изчисля свободното пространство в MB и след това да конвертирам в TB? За съжаление, изглежда, че нито Number::Format, нито Number::Bytes::Human поддържа преобразувания от един "суфикс " на друг, напр. MB -> TB. Има ли съществуващ модул, който прави това? Наистина ми харесва как Number::Format и Number::Bytes::Human обработва и двете SI/не-SI единици (MB срещу MiB), ви позволяват да зададете прецизността и т.н. и затова се колебайте да пусна моето собствено решение, ако подобен пълнофункционален модул вече го прави.

Редактиране: Размерът на екстента не винаги е в MB, нито свободното пространство винаги е в TB, така че не питам как да конвертирам от MB в TB (това би било тривиално). Аз аз питам дали има някакви съществуващи модули, които могат да конвертират от един [произволен] суфикс в друг, без първо да конвертират в байтове.


person ThisSuitIsBlackNot    schedule 31.07.2013    source източник


Отговори (1)


За да конвертирате от MB в TB без преминаване през байтове:

Брой TB = Брой MB * (Байтове в 1 TB/Байтове в 1 MB)


АКТУАЛИЗАЦИЯ: За обобщение:

Брой нови единици = Брой стари единици * (Байтове в 1 нова единица / Байтове в 1 стара единица)

person tjd    schedule 31.07.2013
comment
Съжалявам, трябваше да бъда по-ясен във въпроса си... Няма винаги да конвертирам от MB и не винаги искам да се окажа с TB. Искам моят резултатен низ да бъде възможно най-кратък, което означава да използвам подходящия суфикс (GB, TB, какво имате). - person ThisSuitIsBlackNot; 01.08.2013
comment
@ThisSuitIsBlackNot: Актуализирано - person tjd; 01.08.2013
comment
Не мисля, че разбираш напълно въпроса ми. Имам стойност, при която единиците са неизвестни до времето на изпълнение (може да е kB, GiB, TB и т.н.). След това тази стойност се умножава по цяло число, което също е неизвестно до момента на изпълнение. Как да разберете какви единици трябва да се използват, за да изразите резултата възможно най-кратко (напр. 9,8 GB вместо 10 000 MB)? Има някои прости решения на PerlMonks, но те не вземат предвид неща като мегабайти срещу. мебибайта. Оттук и моят въпрос. - person ThisSuitIsBlackNot; 01.08.2013
comment
Вашите изходни единици ще бъдат много ограничени, може би десетки възможности. Извличането му с регулярен израз би било тривиално. След умножението имате стойност, която е в, над или под желания диапазон (1 до 1000 или 1024). Мащабирайте, ако е необходимо. - person tjd; 01.08.2013