Подтвердить что ты не робот

ItemSize в DynamoDB

Я пытаюсь вычислить размер элемента в dynamoDB, и я не могу понять это определение.

Определение, которое я нашел: Размер элемента - это сумма длин его имен атрибутов и значений (длина двоичных и UTF-8). Таким образом, это помогает, если вы сохраняете имена атрибутов короткими.

Означает ли это, что если я поместил номер в базу данных, например: 1, он примет размер int? вдоль? двойной? Будет ли он занимать столько же места, сколько 100 или 1000000, или потребуется только размер соответствующего бинарного файла?

А что такое вычисление для String?

Есть ли кто-то, кто знает, как его вычислить?

Спасибо

4b9b3361

Ответ 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 даст вам размер элемента приблизительно.