Текст занимает 64 бита в памяти, определяя его информационный размер в байтах

Обновлено: 03.07.2024

Кто-нибудь знает, как получить размер памяти переменной ( int , string , []struct и т. д.) и распечатать ее? Возможно ли это?

5 ответов 5

Для этого можно использовать функцию unsafe.Sizeof. Он возвращает размер в байтах, занятый значением, которое вы ему передаете. Вот рабочий пример:

Обратите внимание, что некоторые платформы явно запрещают использование unsafe, потому что это... ну, небезопасно. Раньше это включало AppEngine. Не уверен, что это так и сегодня, но мне кажется, что да.

Как отмечает @Timur Fayzrakhmanov, Reflect.TypeOf(variable).Size() предоставит вам ту же информацию. Для пакета Reflect действуют те же ограничения, что и для пакета unsafe. То есть: некоторые платформы могут не разрешать его использование.

Что если у меня есть x := make([][256]byte, 8, 16) и я хочу узнать размер x в байтах? unsafe.Sizeof(x) просто вернет 12, независимо от того, сколько байтов выделено.

Я думаю, что это неправильно, небезопасно. Sizeof возвращает размер заголовка слайсов и строк, который представляет собой просто указатель и длину (плюс колпачок для слайсов). Это будет постоянный размер. Вопрос касается использования памяти значением.

Размер переменной можно определить с помощью unsafe.Sizeof(a) . Результат останется тем же для заданного типа (т. е. int, int64, string, struct и т. д.), независимо от значения, которое он содержит. Однако для типа string вас может интересовать размер строки, на которую ссылается переменная, и это определяется с помощью функции len(a) для данной строки. В следующем фрагменте показано, что размер переменной строкового типа всегда равен 8, но длина строки, на которую ссылается переменная, может варьироваться:

Последняя часть вашего вопроса касается присвоения длины (т. е. значения int) строке. Это можно сделать с помощью s := strconv.Itoa(i), где i — переменная типа int, а строка, возвращаемая функцией, присваивается s .

Примечание: имя функции конвертера — Itoa, возможно, это краткая форма для Integer to ASCII. Большинство программистов Golang, скорее всего, неправильно воспримут название функции как Iota .

Тип данных — это характеристика переменной, определяющая, какие данные она может содержать. Типы данных включают те, что указаны в следующей таблице, а также определяемые пользователем типы и определенные типы объектов.

Установить встроенные типы данных

В следующей таблице показаны поддерживаемые типы данных, включая размеры и диапазоны хранения.

+/-7,9228162514264337593543950335 с 28 знаками справа от запятой

Вариант, содержащий массив, требует на 12 байт больше, чем сам массив.

Для массивов данных любого типа требуется 20 байт памяти плюс 4 байта для каждого измерения массива плюс количество байтов, занимаемых самими данными. Память, занимаемая данными, может быть рассчитана путем умножения количества элементов данных на размер каждого элемента.

LongPtr не является истинным типом данных, поскольку он преобразуется в Long в 32-разрядных средах или в LongLong в 64-разрядных средах. LongPtr следует использовать для представления указателей и значений обработки в операторах Declare и позволяет писать переносимый код, который может работать как в 32-разрядных, так и в 64-разрядных средах.

Используйте функцию StrConv для преобразования одного типа строковых данных в другой.

Преобразование между типами данных

В разделе Функции преобразования типов приведены примеры использования следующих функций для приведения выражения к определенному типу данных: CBool, CByte, CCur, CDate, CDbl, CDec, CInt, CLng, CLngLng, CLngPtr, CSng, CStr, и CVar.

Чтобы узнать следующее, см. соответствующие страницы функций: CVErr, Fix и Int.

CLngLng работает только на 64-разрядных платформах.

Проверка типов данных

Чтобы проверить типы данных, см. следующие функции:

Возвращаемые значения для CStr

Если выражение равно CStr возвращает
Boolean Строка, содержащая Верно или неверно.
Дата Строка, содержащая дата в кратком формате вашей системы.
Пусто Строка нулевой длины ("").
Ошибка Строка, содержащая слово Error, за которым следует номер ошибки.
Null Ошибка выполнения.
Другое числовое значение Строка, содержащая число.

См. также

Поддержка и обратная связь

Есть вопросы или отзывы об Office VBA или этой документации?См. раздел Поддержка и отзывы об Office VBA, чтобы узнать, как получить поддержку и оставить отзыв.

Если я хочу сохранить число, скажем, 56789 в файле, сколько байтов потребуется для его хранения в двоичном и текстовом файлах соответственно? Я хочу знать, как байты распределяются между данными в двоичных и текстовых файлах.

5 ответов 5

  • кодировка текста и система счисления (десятичная, шестнадцатеричная и др.)
  • подписано/не подписано
  • одно или несколько целых чисел (требуются разделители)
  • тип данных
  • целевая архитектура
  • использование сжатых кодировок

В ASCII символ занимает 1 байт. В UTF-8 символ занимает от 1 до 4 байтов, а цифры всегда занимают 1 байт. В UTF-16 или Unicode для каждого символа требуется 2 или более байта.

Для форматов, отличных от ASCII, могут потребоваться дополнительные 2 байта (начальная спецификация) для файла, это зависит от редактора и/или настроек, использованных при создании файла.

Но давайте предположим, что вы храните данные в простом файле ASCII, иначе обсуждение станет излишне сложным.

Давайте также предположим, что вы используете десятичную систему счисления.

В шестнадцатеричном формате для представления чисел используются цифры от 0 до 9 и буквы от a до f. Десятичное число (с основанием 10), например 34234324423, будет 7F88655C7 в шестнадцатеричном виде (с основанием 16). В первой системе у нас 11 цифр, во второй всего 9 цифр. Минимальное основание равно 2 (цифры 0 и 1), а общее максимальное основание равно 64 (основание-64). Технически, с помощью ASCII вы можете дойти до base-96, а может и до base-100, но это очень редко.

Каждая цифра (0-9) занимает один байт. Если у вас есть целые числа со знаком, перед цифрами будет стоять дополнительный знак минус (таким образом, отрицательные числа требуют 1 дополнительного байта).

В некоторых случаях может потребоваться сохранить несколько цифр. Вам понадобится разделитель, чтобы различать цифры. Запятая ( , ), двоеточие ( : ), точка с запятой ( ; ), вертикальная черта ( | ) или новая строка ( LF , CR или в Windows CRLF , которая занимает 2 байта) все наблюдались в djungle как законные разделители цифр.< /p>

Что такое число? Понятие или идея количества 8, которое НАХОДИТСЯ В ВАШЕЙ ГОЛОВЕ, — это число. Любое представление этой концепции на камне, бумаге, магнитной ленте или пикселях на экране — это всего лишь ПРЕДСТАВЛЕНИЯ. Это символы, обозначающие то, что вы понимаете в своем мозгу. Это цифры. Пожалуйста, никогда не путайте числа с цифрами, это различие является основой математики и информатики.

В этих случаях вы хотите подсчитывать дополнительный символ для разделителя на число. Или, может быть, на число минус один. Это зависит от того, хотите ли вы завершать каждое число маркером или отделять числа друг от друга:

Пример (три цифры и три символа новой строки): 6 байт

Пример (три цифры и две запятые): 5 байт

Пример (четыре цифры и одна запятая): 5 байт

Пример (знак и одна цифра): 2 байта

Если вы храните данные в двоичном формате (не путать с двоичной системой счисления, которая по-прежнему будет текстовым форматом), занимаемая память зависит от целочисленного типа (или, лучше , длина целого числа в битах).

Октет (0..255) будет занимать 1 байт. Разделители и ведущие знаки не требуются.

16-битное число с плавающей запятой будет занимать 2 байта. Для C и C++ необходимо учитывать базовую архитектуру. Обычное целое число в 32-битной архитектуре займет 4 байта. Тот же самый код, скомпилированный для 64-битной архитектуры, займет 8 байт.

Есть исключения из этих плоских правил. Например, protobuf от Google использует зигзагообразную реализацию VarInt, использующую кодирование переменной длины.

EDIT: добавлено предложение Томаса Веллера

Помимо фактического СОДЕРЖИМОГО файла вам придется хранить метаданные о файле (для учета, такие как первый сектор, имя файла, права доступа и многое другое). Эти метаданные не отображаются для файла, занимающего место на диске, но на самом деле там есть.

Если вы храните каждое число в отдельном файле, например число 10 в файле result-10, эти записи метаданных будут занимать больше места, чем сами числа.

Если вы храните десять, сотни, тысячи или миллионы/миллиарды чисел в одном файле, эти накладные расходы становятся все более несущественными.

EDIT: чтобы было понятнее о служебных файлах

Накладные расходы зависят от обстоятельств, как обсуждалось выше.

Но это не различие между текстовым и двоичным форматами. Как говорит doug65536, как бы вы ни хранили данные, если структура файловой системы одинакова, это не имеет значения.

Файл — это файл независимо от того, содержит ли он двоичные данные или текст ASCII.

Тем не менее, приведенные выше рассуждения применимы независимо от выбранного вами формата.

Справочное руководство по MySQL 5.7, включая MySQL NDB Cluster 7.5 и кластер NDB 7.6

11.7 Требования к хранению типов данных

Требования к хранению табличных данных на диске зависят от нескольких факторов. Различные механизмы хранения представляют типы данных и хранят необработанные данные по-разному. Табличные данные могут быть сжаты как для столбца, так и для всей строки, что усложняет расчет требований к хранилищу для таблицы или столбца.

Несмотря на различия в расположении хранилища на диске, внутренние API-интерфейсы MySQL, которые взаимодействуют и обмениваются информацией о строках таблицы, используют согласованную структуру данных, применимую ко всем механизмам хранения.

Этот раздел включает рекомендации и информацию о требованиях к хранилищу для каждого типа данных, поддерживаемого MySQL, включая внутренний формат и размер для механизмов хранения, которые используют представление фиксированного размера для типов данных. Информация указана по категориям или механизмам хранения.

Внутреннее представление таблицы имеет максимальный размер строки 65 535 байт, даже если механизм хранения поддерживает строки большего размера. Эта цифра не включает столбцы BLOB или TEXT, которые вносят только 9–12 байтов в этот размер. Для данных BLOB и TEXT информация хранится внутри в области памяти, отличной от буфера строк. Различные механизмы хранения обрабатывают выделение и хранение этих данных по-разному, в зависимости от метода, который они используют для обработки соответствующих типов. Дополнительную информацию см. в Главе 15, Альтернативные механизмы хранения, и в Разделе 8.4.7, "Ограничения на количество столбцов таблицы и размер строки".

Требования к хранилищу таблиц InnoDB

См. Раздел 14.11, «Форматы строк InnoDB» для получения информации о требованиях к хранилищу для таблиц InnoDB.

Требования к хранению таблиц NDB

Таблицы NDB используют 4-байтовое выравнивание; все хранение данных NDB выполняется в кратных 4 байтам. Таким образом, значение столбца, которое обычно занимает 15 байтов, требует 16 байтов в таблице NDB. Например, в таблицах NDB для типов столбцов TINYINT , SMALLINT , MEDIUMINT и INTEGER ( INT ) требуется 4 байта памяти на запись из-за фактора выравнивания.

Каждый столбец BIT( M ) занимает M бит дискового пространства. Хотя отдельный столбец BIT не выровнен по 4 байтам, NDB резервирует 4 байта (32 бита) на строку для первых 1–32 битов, необходимых для столбцов BIT, а затем еще 4 байта для битов 33–64. и т. д.

Хотя сам NULL не требует места для хранения, NDB резервирует 4 байта на строку, если определение таблицы содержит какие-либо столбцы, определенные как NULL, до 32 столбцов NULL. (Если таблица кластера NDB определена с числом от 32 столбцов NULL до 64 столбцов NULL, то резервируется 8 байтов на строку.)

Для каждой таблицы, использующей механизм хранения NDB, требуется первичный ключ; если вы не определяете первичный ключ, NDB создает «скрытый» первичный ключ. Этот скрытый первичный ключ занимает 31–35 байт на запись таблицы.

Вы можете использовать сценарий Perl ndb_size.pl для оценки требований к хранилищу NDB. Он подключается к текущей базе данных MySQL (не NDB Cluster) и создает отчет о том, сколько места потребовалось бы для этой базы данных, если бы она использовала механизм хранения NDB. Дополнительную информацию см. в Разделе 21.5.29, «ndb_size.pl — Оценщик требований к размеру NDBCLUSTER».

Требования к хранению числового типа

Значения для столбцов DECIMAL (и NUMERIC ) представлены в двоичном формате, который упаковывает девять десятичных цифр (с основанием 10) в четыре байта. Память для целой и дробной частей каждого значения определяется отдельно. Каждая цифра, кратная девяти, требует четырех байтов, а «остаточные» цифры требуют некоторой части четырех байтов. Объем памяти, необходимый для избыточных цифр, указан в следующей таблице.

Остаточные цифры Количество байтов
0 0
1 1
2 1
3 2
4 2
5 3
6 3
7 4
8 4

Требования к хранению даты и времени

Для столбцов TIME , DATETIME и TIMESTAMP объем памяти, необходимый для таблиц, созданных до версии MySQL 5.6.4, отличается от объема памяти, созданного начиная с версии 5.6.4. Это связано с изменением в 5.6.4, которое позволяет этим типам иметь дробную часть, для которой требуется от 0 до 3 байтов.

Тип данных Хранилище, необходимое до MySQL 5.6.4 Хранилище, необходимое начиная с MySQL 5.6.4
ГОД 1 байт 1 байт
ДАТА 3 байта 3 байта
TIME 3 байта 3 байта + хранение долей секунды
DATETIME 8 байт 5 байт + хранение долей секунды
TIMESTAMP 4 байта 4 байта + хранилище долей секунды

Начиная с MySQL 5.6.4, хранилище для YEAR и DATE остается неизменным. Однако TIME , DATETIME и TIMESTAMP представлены по-разному. DATETIME упакован более эффективно, требуя 5, а не 8 байтов для недробной части, и все три части имеют дробную часть, которая требует от 0 до 3 байтов, в зависимости от точности долей секунды хранимых значений.

< /tbody>

Например, TIME(0) , TIME(2) , TIME(4) и TIME(6) используют 3, 4, 5 и 6 байтов соответственно. TIME и TIME(0) эквивалентны и требуют одинакового хранилища.

Подробнее о внутреннем представлении временных значений см. в статье Внутреннее устройство MySQL: важные алгоритмы и структуры.

Требования к хранилищу строкового типа

В следующей таблице M представляет объявленную длину столбца в символах для недвоичных типов строк и в байтах для двоичных типов строк. L представляет фактическую длину заданного строкового значения в байтах.

Точность долей секунды Требуется объем памяти
0 0 байт
1, 2 1 байт
3, 4 2 байта
5, 6 3 байта
< td> L + 3 байта, где L 24
Тип данных Требуемое хранилище
CHAR( M ) Компактное семейство форматов строк InnoDB оптимизирует хранение наборов символов переменной длины. См. Характеристики хранения COMPACT Row Format. В противном случае M × w байт, M 255, где w — количество байтов, необходимое для символа максимальной длины в набор символов.
BINARY( M ) M байт, 0 M 255
VARCHAR( M ), VARBINARY( M ) L + 1 байт, если для значений столбца требуется 0–255 байт, L + 2 байта, если для значений может потребоваться более 255 байт
TINYBLOB , TINYTEXT L + 1 байт, где L 8
BLOB , TEXT < /td> L + 2 байта, где L 16
MEDIUMBLOB , MEDIUMTEXT
LONGBLOB , LONGTEXT L + 4 байта, где L 32
ENUM(' value1 ',' value2 '. ) 1 или 2 байта, в зависимости от количества значений перечисления (максимум 65 535 значений)
SET(' <эм> значение1 ',' значение2 '. ) 1, 2, 3, 4 или 8 байт, в зависимости от количества элементов набора (максимум 64 элемента)

Типы строк переменной длины сохраняются с использованием префикса длины и данных. Префикс длины требует от одного до четырех байтов в зависимости от типа данных, а значение префикса равно L (длина строки в байтах). Например, для хранения значения MEDIUMTEXT требуется L байтов для хранения значения плюс три байта для хранения длины значения.

Чтобы рассчитать количество байтов, используемых для хранения определенного значения столбца CHAR , VARCHAR или TEXT, необходимо принять во внимание набор символов, используемый для этого столбца, а также то, содержит ли значение многобайтовые символы. В частности, при использовании набора символов Unicode utf8 вы должны иметь в виду, что не все символы используют одинаковое количество байтов. Для наборов символов utf8mb3 и utf8mb4 может потребоваться до трех и четырех байтов на символ соответственно. Разбивку хранилища, используемого для различных категорий символов utf8mb3 или utf8mb4, см. в разделе 10.9, «Поддержка Unicode».

Типы VARCHAR, VARBINARY и BLOB и TEXT имеют переменную длину. Для каждого требования к хранилищу зависят от следующих факторов:

Фактическая длина значения столбца

Максимально возможная длина столбца

Набор символов, используемый для столбца, поскольку некоторые наборы символов содержат многобайтовые символы

Например, столбец VARCHAR(255) может содержать строку максимальной длиной 255 символов. Предполагая, что столбец использует набор символов latin1 (один байт на символ), фактическое требуемое хранилище — это длина строки ( L ) плюс один байт для записи длины строки. Для строки 'abcd' L равно 4, а требование к памяти составляет пять байтов.Если тот же столбец вместо этого объявлен для использования двухбайтового набора символов ucs2, требование хранения составляет 10 байтов: длина «abcd» составляет восемь байтов, а для столбца требуется два байта для хранения длин, поскольку максимальная длина превышает 255. (до 510 байт).

Действительное максимальное количество байтов, которое может храниться в столбце VARCHAR или VARBINARY, зависит от максимального размера строки в 65 535 байт, который является общим для всех столбцов. Для столбца VARCHAR, в котором хранятся многобайтовые символы, эффективное максимальное количество символов меньше. Например, для символов utf8mb3 может потребоваться до трех байтов на символ, поэтому для столбца VARCHAR, использующего набор символов utf8mb3, может быть объявлено максимум 21 844 символа. См. Раздел 8.4.7, «Ограничения на количество столбцов таблицы и размер строки».

InnoDB кодирует поля фиксированной длины, превышающие или равные 768 байтам, как поля переменной длины, которые можно хранить вне страницы. Например, столбец CHAR(255) может превышать 768 байт, если максимальная длина набора символов в байтах больше 3, как в случае с utf8mb4 .

Подсистема хранения NDB поддерживает столбцы переменной ширины. Это означает, что для столбца VARCHAR в таблице кластера NDB требуется такой же объем памяти, как и для любого другого механизма хранения, за исключением того, что такие значения выровнены по 4 байтам. Таким образом, строка 'abcd', хранящаяся в столбце VARCHAR(50) с использованием набора символов latin1, требует 8 байтов (вместо 5 байтов для того же значения столбца в таблице MyISAM).

Столбцы TEXT и BLOB реализованы по-разному в механизме хранения NDB, где каждая строка в столбце TEXT состоит из двух отдельных частей. Один из них имеет фиксированный размер (256 байт) и фактически хранится в исходной таблице. Другой состоит из любых данных, превышающих 256 байт, которые хранятся в скрытой таблице. Строки в этой второй таблице всегда имеют длину 2000 байт. Это означает, что размер столбца TEXT равен 256, если size size представляет размер строки); в противном случае размер равен 256 + size + (2000 × ( size − 256) % 2000).

Размер объекта ENUM определяется количеством различных значений перечисления. Один байт используется для перечисления до 255 возможных значений. Два байта используются для перечислений, имеющих от 256 до 65 535 возможных значений. См. Раздел 11.3.5, «Тип ENUM».

Требования к хранилищу пространственного типа

MySQL хранит значения геометрии, используя 4 байта для указания SRID, за которым следует WKB-представление значения. Функция LENGTH() возвращает пространство в байтах, необходимое для хранения значения.

Описания WKB и внутренних форматов хранения пространственных значений см. в Разделе 11.4.3, «Поддерживаемые форматы пространственных данных».

Требования к хранилищу JSON

В целом требования к хранилищу для столбца JSON примерно такие же, как для столбца LONGBLOB или LONGTEXT; то есть пространство, используемое документом JSON, примерно такое же, как и для строкового представления документа, хранящегося в столбце одного из этих типов. Однако двоичное кодирование, включая метаданные и словари, необходимые для поиска отдельных значений, хранящихся в документе JSON, связано с накладными расходами. Например, для строки, хранящейся в документе JSON, требуется от 4 до 10 байт дополнительного пространства в зависимости от длины строки и размера объекта или массива, в котором она хранится.

Кроме того, MySQL налагает ограничение на размер любого документа JSON, хранящегося в столбце JSON, так что он не может превышать значение max_allowed_packet .

Читайте также: