ItemSize в DynamoDB - PullRequest
       15

ItemSize в DynamoDB

41 голосов
/ 24 января 2012

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

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

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

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

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

Спасибо

Ответы [ 6 ]

38 голосов
/ 26 января 2012

Это действительно нетривиальная тема - вы уже процитировали несколько небрежное определение из Amazon DynamoDB Data Model :

Размер элемента - это сумма длин его атрибутаимена и значения (двоичная длина и длина UTF-8).

Это подробно описано ниже на странице Типы данных Amazon DynamoDB , немного:

  • String - Строки являются Unicode с двоичным кодированием UTF8.
  • Число - Числа являются положительными или отрицательными точными десятичными знаками ицелые числа.Число может иметь до 38 цифр точности после десятичной точки и может быть от 10 ^ -128 до 10 ^ + 126.Представление в Amazon DynamoDB имеет переменную длину.Начальные и конечные нули обрезаются.

Аналогичный вопрос был задан на форуме Amazon DynamoDB (см. Любопытный характер "Число "type ) и ответ от Stefano @ AWS проливают больше света на проблему:

  • Тип" Number "имеет 38 цифрточности Это действительные десятичные цифры.Таким образом, он может представлять довольно большие числа, и нет потери точности.
  • Сколько места занимает числовое значение? Не слишком много. Наше внутреннее представление имеет переменную длину , поэтому размер соотносится с фактическим (по сравнению с максимальным) количеством цифр в значении.Кстати, начальные и конечные нули обрезаются. [выделено мной]

В последующем посте Кристофера Смита дается более глубокое понимание итоговых последствий, касающихся потребления памяти и его расчета, он заключает:

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

Хотя Amazon пока не выставляет свои платежные данные через API , ониБудем надеяться, что в какой-то момент я добавлю возможность извлекать некоторую информацию о размере элемента в API DynamoDB, как это предлагал Кристофер.

10 голосов
/ 29 сентября 2015

Я нашел этот ответ на форуме разработчиков 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 голосов
/ 20 августа 2015

Вы можете использовать алгоритм для вычисления размера элемента DynamoDB в бэкэнде хранилища DynamoDB для Titan DynamoDBDelegate class.

2 голосов
/ 26 января 2019

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

Если вас интересуют подробности, прочитайте это сообщение в блоге .

В противном случаеЯ также создал калькулятор размера элемента DynamoDB и потребляемой мощности , который точно определяет размеры элемента.

Числа - это самый сложный тип DynamoDB.AWS публично не документирует, как определить, сколько байтов в числе.Они говорят, что это так, чтобы они могли изменить внутреннюю реализацию, не привязывая к ней никого.Однако то, что они говорят, звучит просто, но на практике все сложнее.

Хотя в общих чертах формула выглядит примерно так: 1 байт на каждые 2 значащие цифры, плюс 1 дополнительный байт для положительных чиселили 2 для отрицательных чисел .Следовательно, 27 - это 2 байта, а -27 - это 3 байта.DynamoDB округляется, если количество цифр неравномерно, поэтому 461 будет использовать 3 байта (включая дополнительный байт).Перед вычислением размера начальные и конечные нули обрезаются.

0 голосов
/ 12 декабря 2018

Примерное количество элементов в таблице 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 потребуются дополнительные блоки запроса на чтение. Общее количество требуемых единиц запроса на чтение зависит от размера элемента и от того, хотите ли вы в конечном итоге согласованное или строго согласованное чтение.

0 голосов
/ 12 июня 2017

Самый простой подход - создать элемент в таблице и экспортировать элемент в CSV-файл, который доступен в DynamoDB.Размер файла CSV даст вам размер элемента примерно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...