Как эффективно подсчитать кол-во байт для выделения буфера на чтение?
Например на вход идет n целых чисел в строке разделенных пробелами. Гарантируется что 1 <= n <= 100 000.
Также гарантируется что каждое 1 <= ni <= 10^9, а значит число ni входит в диапазон int32 на каждое число которого нужно 4 байта. На пробел в соответствии с таблицей ascii требуется 2 байта.
Как эффективно подсчитать какое максимальное кол-во байт может занять ввод в худшем случае?
Верно ли будет подсчитывать с помощью моей формулы: (4 * 100000) + (2 * 100000) = 600000 байт = 585.94 кб ?
Если нет то подскажите верную и объясните почему.
Я хочу эффективно выделять размер буфера для ввода на golang
Lynn «Кофеман», иначе массив байтов из потока не разделить на отдельные числа, да и вообще вы понимаете что такое буфер? В буфер записывается массив байтов с ввода, вплоть до байтов сброса каретки. На него нельзя воздействовать. И потом байты буфера преобразуются в нужные типы и значения данных
yxtiblin, форум не может понять какой буфер тебе нужен.
Для того чтоб загрузить в память 100 тысячи целых чисел типа (int32)
ты и должен аллоцировать массив на сто тысяч. И нечего здесь мудрить.
Если числа представлены изначально в виде текстового файла - то мы должны знать
формат как они представлены чтобы его распарить нормально. В 99% случаев
это будет последовательность разделенная переводами строк
mayton2019, стандартный буфер ввода, ни в каком из языков он не отличается на низком уровне насколько мне известно.
А буфер после чтения строки например: 2 54 13 43 23
будет выглядеть так: 2 32 43 32 13 32 43 32 23 10 13 (байты 10, 13, 32 это перевод строки, возврат каретки, пробел соответственно, в 10тичной системе)
и я хочу уточнить как должна выглядеть формула чтобы создать эффективный буфер нужного размера, который не будет использовать лишние байты
Lynn «Кофеман», максимальная длина одной строки ввода 100000, при этом каждая цифра может занимать до 4 байтов, а пробел 1 байт, почему не верны? (Говорю это заранее зная что при размере 10 байтов в ввод не входило даже 5 чисел из 100 000 и ответ получался неверный)
Вы читаете строку. Максимальное число 10^9 это единица и 9 нулей — итого 10 цифр каждая из которых в исходном файле занимает 1 байт.
Но в целом вам уже правильно ответили, что не нужно заниматься странными вычислениями, а просто взять готовый сканер, а уж что и как он там будет буферизировать это его проблемы.
Буфер он на то и буфер, что не должен вмещать в себя весь ввод. Он хранит в себе кусок ввода, чтобы уменьшить количество системных вызовов. Вам правильно в ответе подсказывают использовать пакет bufio, там все эти вещи уже сделаны за вас, просто используйте.
Не нужно вычислять объём памяти для буфера. Просто используй интерфейс io.Reader для потоковой обработки. scanner := bufio.NewScanner(os.Stdin) scanner.Text()вернёт токен с числом в строке.