ItemSize в DynamoDB
Я пытаюсь вычислить размер элемента в dynamoDB, и я не могу понять это определение.
Определение, которое я нашел: Размер элемента - это сумма длин его имен атрибутов и значений (длина двоичных и UTF-8). Таким образом, это помогает, если вы сохраняете имена атрибутов короткими.
Означает ли это, что если я поместил номер в базу данных, например: 1, он примет размер int? вдоль? двойной? Будет ли он занимать столько же места, сколько 100 или 1000000, или потребуется только размер соответствующего бинарного файла?
А что такое вычисление для String?
Есть ли кто-то, кто знает, как его вычислить?
Спасибо
Ответы
Ответ 1
Это действительно тривиальный вопрос. Вы уже цитировали несколько неаккуратное определение из Amazon DynamoDB Data Model:
Размер элемента - это сумма длин его имен атрибутов и значений (длина двоичных и UTF-8).
Ниже подробно описывается ниже Типы данных Amazon DynamoDB:
- Строка. Строки являются Unicode с двоичной кодировкой UTF8.
- Число. Цифры - это положительные или отрицательные точные значения и целые числа. Число может иметь до 38 цифр точности после десятичной точки и может быть между 10 ^ -128 до 10 ^ + 126. Представление в Amazon DynamoDB имеет переменную длину. Верхние и конечные нули обрезаны.
Аналогичный вопрос, чем ваш, был задан в форуме Amazon DynamoDB (см. Любопытный характер типа "Число" ), а ответ от Stefano @AWS проливает больше света на проблему:
- Тип "Число" имеет 38 цифр точности. Это фактические десятичные числа цифры. Таким образом, он может представлять довольно большие числа, и нет прецизионные потери.
- Сколько места занимает числовое значение? Не слишком много. Наше внутреннее представление переменной длины, поэтому размер коррелирует с фактическим (против максимального) количеством цифр в значении. Ведущие и конечные нули обрезаны кстати. [акцент мой]
постсоветский пост Кристофера Смита дает больше информации о последствиях, связанных с потреблением памяти и его расчетами, он заключает:
Существующий API предоставляет очень мало информации для хранения потребления, хотя это часть (по общему признанию, не тот значительный) биллинга. Единственная информация - это совокупность размер таблицы, и даже эти данные являются потенциально часами вне синхронизации.
Пока Amazon не показывает данные биллинга через API еще, они, надеюсь, добавят возможность получить некоторую информацию о размере элемента для API DynamoDB в какой-то момент, как предложил Кристофер.
Ответ 2
Я нашел этот ответ на форуме разработчиков amazon, на который ответил Clarence @AWS:
например: -
"Item":{
"time":{"N":"300"},
"feeling":{"S":"not surprised"},
"user":{"S":"Riley"}
}
чтобы рассчитать размер указанного объекта:
Размер элемента представляет собой сумму длин имен атрибутов и значений,
интерпретируются как символы UTF-8. В этом примере количество байтов
поэтому элемент является суммой
Time : 4 + 3
Feeling : 7 + 13
User : 4 + 5
Это 36
Для формального определения обратитесь к:
http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/WorkingWithDDItems.html
Ответ 3
Вы можете использовать алгоритм вычисления размера элемента DynamoDB в классе DynamoDB Storage Backend для Titan DynamoDBDelegate.
Ответ 4
Примерное значение, занимаемое элементом в вашей таблице DynamoDB, - это ходатайство о получении с библиотекой boto3.
Это не точное решение относительно размера элемента, но оно поможет вам составить идею. При выполнении batch_get_item(**kwargs)
вы получаете ответ, который включает ConsumedCapacity
в следующей форме:
....
'ConsumedCapacity': [
{
'TableName': 'string',
'CapacityUnits': 123.0,
'ReadCapacityUnits': 123.0,
'WriteCapacityUnits': 123.0,
'Table': {
'ReadCapacityUnits': 123.0,
'WriteCapacityUnits': 123.0,
'CapacityUnits': 123.0
},
'LocalSecondaryIndexes': {
'string': {
'ReadCapacityUnits': 123.0,
'WriteCapacityUnits': 123.0,
'CapacityUnits': 123.0
}
},
'GlobalSecondaryIndexes': {
'string': {
'ReadCapacityUnits': 123.0,
'WriteCapacityUnits': 123.0,
'CapacityUnits': 123.0
}
}
},
]
...
Оттуда вы можете увидеть, сколько единиц емкости потребовалось, и вы можете извлечь и приблизительный размер предмета. Очевидно, это основано на вашей конфигурации системы из-за того, что:
Один блок запроса на чтение представляет один строго согласованный запрос на чтение или два в конечном итоге согласованных запроса на чтение для элемента размером до 4 КБ. Транзакционные запросы на чтение требуют 2 блока запроса на чтение для выполнения одного чтения для элементов размером до 4 КБ. Если вам нужно прочитать элемент размером более 4 КБ, DynamoDB потребуются дополнительные блоки запроса на чтение. Общее количество требуемых единиц запроса на чтение зависит от размера элемента и от того, хотите ли вы в конечном итоге согласованное или строго согласованное чтение.
Ответ 5
Размер элемента - это сумма всех его размеров атрибутов, включая атрибуты хеша и ключа диапазона. Сами атрибуты имеют имя и значение. И имя, и значение влияют на размер атрибута. Имена имеют такой же размер, как и строковые значения. Все значения имеют разный размер в зависимости от их типа данных.
Если вы заинтересованы в мельчайших подробностях, прочитайте это сообщение в блоге.
В противном случае я также создал калькулятор размера и потребляемой мощности DynamoDB, который точно определяет размеры элементов.
Числа DynamoDB легко относятся к наиболее сложному типу. AWS публично не документирует, как определить, сколько байтов в числе. Они говорят, что это так, чтобы они могли изменить внутреннюю реализацию, не привязывая к ней никого. Однако то, что они говорят, звучит просто, но на практике сложнее.
Тем не менее, в общих чертах, формула выглядит примерно как 1 байт на каждые 2 значащие цифры, плюс 1 дополнительный байт для положительных чисел или 2 для отрицательных чисел. Следовательно, 27
составляет 2 байта, а -27
составляет 3 байта. DynamoDB округляется, если количество цифр неравномерно, поэтому 461
будет использовать 3 байта (включая дополнительный байт). Ведущие и конечные нули обрезаются перед вычислением размера.
Ответ 6
Самый простой способ - создать элемент в таблице и экспортировать элемент в файл csv, который является опцией, доступной в DynamoDB. Размер файла csv даст вам размер элемента приблизительно.