web-dev-qa-db-fra.com

ItemSize dans DynamoDB

J'essaie de calculer la taille d'un élément dans dynamoDB et je ne parviens pas à comprendre la définition.

La définition que j'ai trouvée: Une taille d'élément est la somme des longueurs de ses noms et valeurs d'attributs (longueurs binaires et UTF-8). Il est donc utile de garder les noms d'attribut courts.

Cela signifie-t-il que si je mets un nombre dans la base de données, par exemple: 1 cela prend la taille d'un int? un long? un double ? Prendra-t-il le même espace que 100 ou 1000000 ou ne prendra-t-il que la taille du binaire correspondant?

Et quelle est l'informatique pour String?

Est-ce que quelqu'un sait comment le calculer? 

Je vous remercie

40
Mike

C'est un sujet non trivial en effet - vous avez déjà cité la définition quelque peu bâclée du modèle de données modèle de données Amazon DynamoDB :

Une taille d'élément est la somme des longueurs de ses noms d'attribut et de ses valeurs (longueurs binaires et UTF-8).

Ceci est détaillé plus loin dans la page à l'intérieur de Types de données Amazon DynamoDB un peu:

  • String - Les chaînes sont au format Unicode avec codage binaire UTF8.
  • Nombre - Les nombres sont des nombres décimaux et des entiers positifs ou négatifs. Un nombre peut avoir jusqu'à 38 chiffres de précision après le point décimal et se situer entre 10 ^ -128 et 10 ^ + 126. La représentation dans Amazon DynamoDB est de longueur variable. Les zéros au début et à la fin sont supprimés.

Une question similaire à la vôtre a également été posée dans le forum Amazon DynamoDB (voir Nature curieuse du type "Nombre" ) et le réponse de Stefano @ AWS . _ apporte plus de lumière sur le sujet:

  • Le type "Nombre" a 38 chiffres de précision Ce sont des décimales réelles chiffres. Donc, cela peut représenter un assez grand nombre, et il n'y a pas de perte de précision.
  • Combien d'espace prend une valeur numérique? Pas trop beaucoup. Notre représentation interne étant une longueur variable, la taille est donc en corrélation avec le nombre réel (par rapport au maximum) de chiffres dans la valeur . Les zéros au début et à la fin sont ajustés. [mon accentuation]

_ { Le post suivi de Christopher Smith } _ présente de manière plus détaillée les conséquences qui en résultent pour la consommation de stockage et son calcul, conclut-il:

L'API existante fournit très peu d'informations sur le stockage consommation, même si cela fait partie (certes, pas que significatif) de la facturation. La seule information est l'agrégat taille de la table, et même ces données sont potentiellement désynchronisées pendant des heures.

Bien qu'Amazon n'expose pas encore ses données de facturation via une API , ils ajouteront éventuellement une option permettant de récupérer des informations concernant la taille de l'élément dans l'API DynamoDB à un moment donné, comme suggéré par Christopher.

38
Steffen Opel

J'ai trouvé cette réponse dans le forum des développeurs Amazon avec Clarence @ AWS:

par exemple:-

"Item":{
"time":{"N":"300"},
"feeling":{"S":"not surprised"},
"user":{"S":"Riley"}
}

afin de calculer la taille de l'objet ci-dessus: 

La taille d'élément est la somme des longueurs des noms d'attributs et des valeurs, interprétées comme des caractères UTF-8. Dans l'exemple, le nombre d'octets de L'élément est donc la somme de 

Time : 4 + 3 
Feeling : 7 + 13 
User : 4 + 5          

Qui est 36

Pour la définition formelle, voir: http://docs.amazonwebservices.com/amazondynamodb/latest/developerguide/WorkingWithDDItems.html

10
Asanga Dewaguru

Vous pouvez utiliser l'algorithme pour calculer la taille d'un élément DynamoDB dans le backend de stockage DynamoDB pour Titan DynamoDBDelegate class.

3

La taille d’un élément est la somme de la taille de tous ses attributs, y compris les attributs de hachage et de clé de plage . Les attributs eux-mêmes ont un nom et une valeur. Le nom et la valeur contribuent tous deux à la taille d’un attribut . Les noms sont dimensionnés de la même manière que les valeurs de chaîne. Toutes les valeurs sont dimensionnées différemment en fonction de leur type de données.

Si les détails vous intéressent, lisez cet article de blog .

Sinon, j'ai également créé un Calculateur de taille d'élément et de capacité consommée DynamoDB qui détermine avec précision la taille des éléments.

Les nombres sont facilement le type le plus compliqué de DynamoDB. AWS ne documente pas publiquement comment déterminer le nombre d'octets contenus dans un nombre. Ils disent que c'est pour qu'ils puissent modifier la mise en œuvre interne sans que personne ne soit lié à celle-ci. Ce qu'ils disent, cependant, semble simple mais est plus compliqué en pratique.

En gros, cependant, la formule est quelque chose comme 1 octet pour 2 chiffres significatifs, plus un octet supplémentaire pour les nombres positifs ou 2 pour les nombres négatifs. Par conséquent, 27 est 2 octets et -27 est 3 octets. DynamoDB arrondira si le nombre de chiffres est inégal. 461 utilisera 3 octets (y compris l’octet supplémentaire). Les zéros de tête et de fin sont coupés avant le calcul de la taille.

1
Zac Charles

Une approximation de la quantité occupée par un élément dans votre table DynamoDB consiste à faire une requête get avec la bibliothèque boto3.

Ce n’est pas une solution exacte de la taille d’un élément, mais elle vous aidera à vous faire une idée. Lorsque vous effectuez une batch_get_item(**kwargs), vous obtenez une réponse incluant la ConsumedCapacity sous la forme suivante:

....
'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
            }
        }
    },
]
...

À partir de là, vous pouvez voir la quantité d’unités de capacité utilisée et extraire une taille approximative de l’article. Évidemment, cela est basé sur votre configuration du système en raison du fait que:

Une unité de demande de lecture représente une demande de lecture fortement cohérente, ou deux demandes de lecture éventuellement cohérentes, pour un élément d'une taille maximale de 4 Ko. Les demandes de lecture transactionnelle nécessitent 2 unités de demande de lecture pour effectuer une lecture pour des éléments allant jusqu'à 4 Ko. Si vous devez lire un élément supérieur à 4 Ko, DynamoDB a besoin d'unités de demande de lecture supplémentaires. Le nombre total d'unités de demande de lecture requises dépend de la taille de l'élément et de la nécessité d'une lecture cohérente ou cohérente.

0
Drubio