Я пытаюсь рассчитать свободное пространство на физическом томе 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 обрабатывает единицы СИ и не СИ (МБ против МиБ), позволяет вам установить точность и т. д., и поэтому не решайтесь использовать мое собственное решение, если аналогичный полнофункциональный модуль уже делает это.
Изменить: размер экстента не всегда указывается в МБ, а свободное пространство не всегда в ТБ, поэтому я не спрашиваю, как преобразовать МБ в ТБ (это было бы тривиально). Я задаю вопрос, существуют ли какие-либо существующие модули, которые могут преобразовывать один [произвольный] суффикс в другой без предварительного преобразования в байты.