Модуль Perl для преобразования между МБ/ГБ/ТБ без предварительного преобразования в байты?

Я пытаюсь рассчитать свободное пространство на физическом томе 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 (йоттабайт), но он все еще находится в альфа-версии, поэтому я не решаюсь использовать его в рабочем коде.

Следующей моей мыслью было, зачем вообще преобразовывать в байты, когда я могу вычислить свободное пространство в МБ, а затем преобразовать в ТБ? К сожалению, похоже, что ни Number::Format, ни Number::Bytes::Human поддерживает преобразования из одного "суффикса " к другому, например МБ -> ТБ. Есть ли существующий модуль, который делает это? Мне очень нравится, как Number::Format и Number::Bytes::Human обрабатывает единицы СИ и не СИ (МБ против МиБ), позволяет вам установить точность и т. д., и поэтому не решайтесь использовать мое собственное решение, если аналогичный полнофункциональный модуль уже делает это.

Изменить: размер экстента не всегда указывается в МБ, а свободное пространство не всегда в ТБ, поэтому я не спрашиваю, как преобразовать МБ в ТБ (это было бы тривиально). Я задаю вопрос, существуют ли какие-либо существующие модули, которые могут преобразовывать один [произвольный] суффикс в другой без предварительного преобразования в байты.


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


Ответы (1)


Чтобы преобразовать из МБ в ТБ без прохождения байтов:

Количество ТБ = количество МБ * (байт в 1 ТБ/байт в 1 МБ)


ОБНОВЛЕНИЕ: Чтобы обобщить:

Количество новых блоков = количество старых блоков * (байт в 1 новом блоке / байт в 1 старом блоке)

person tjd    schedule 31.07.2013
comment
Извините, я должен был быть более четким в своем вопросе ... Я не всегда буду конвертировать из МБ и не всегда хочу в конечном итоге получить ТБ. Я хочу, чтобы моя результирующая строка была как можно короче, что означает использование соответствующего суффикса (GB, TB, что у вас есть). - person ThisSuitIsBlackNot; 01.08.2013
comment
@ThisSuitIsBlackNot: обновлено - person tjd; 01.08.2013
comment
Мне кажется, вы не совсем понимаете мой вопрос. У меня есть значение, в котором единицы неизвестны до времени выполнения (могут быть кБ, ГиБ, ТБ и т. д.). Затем это значение умножается на целое число, которое также неизвестно до времени выполнения. Как определить, какие единицы следует использовать для максимально краткого выражения результата (например, 9,8 ГБ вместо 10 000 МБ)? На PerlMonks есть несколько простых решений, но они не учитывают такие вещи, как мегабайты и объем памяти. мебибайты. Отсюда мой вопрос. - person ThisSuitIsBlackNot; 01.08.2013
comment
Ваши исходные единицы будут очень ограничены, возможно, несколько десятков вариантов. Извлечь его с помощью регулярного выражения было бы тривиально. После умножения у вас есть значение, которое находится выше или ниже желаемого диапазона (от 1 до 1000 или 1024). Масштабируйте по мере необходимости. - person tjd; 01.08.2013