Опитвам се да изчисля свободното пространство на физически том на 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 (това би било тривиално). Аз аз питам дали има някакви съществуващи модули, които могат да конвертират от един [произволен] суфикс в друг, без първо да конвертират в байтове.