DynamoDBで項目のサイズを計算しようとしていますが、定義を理解できません。
私が見つけた定義:項目サイズは、属性名と値の長さ(バイナリおよびUTF-8の長さ)の合計です。したがって、属性名を短くしておくと役立ちます。
たとえば、データベースに数値を入力すると、1はintのサイズが使用されるということですか?長い?ダブル? 100または1000000と同じ量のスペースが必要ですか、それとも対応するバイナリのサイズのみが必要ですか?
そして、文字列の計算は何ですか?
それを計算する方法を知っている人はいますか?
ありがとうございました
これはささいなことですが、すでに Amazon DynamoDB Data Model からややずさんな定義を引用しています。
アイテムサイズは、属性名と値の長さの合計です(バイナリおよびUTF-8の長さ)。
これについては、ページの下の方に詳しく説明されています Amazon DynamoDBデータ型 少し:
Amazon DynamoDBフォーラム でも同様の質問が行われました( [数値]タイプの奇妙な性質 を参照)および Stefano @からの回答] AWS この問題をさらに詳しく説明します。
- 「数値」タイプの精度は38桁ですこれらは実際の10進数です。したがって、かなり大きな数を表すことができ、精度の低下はありません。
- Number値はどのくらいのスペースを使用しますか?あまり多くありません。 私たちの内部表現は可変長なので、サイズは値の実際の(最大の)桁数と相関しています。先行ゼロと後続ゼロは同時にトリミングされます。 [重点鉱山]
Christopher Smithのフォローアップポスト は、ストレージの消費とその計算に関する結果の影響について、より多くの洞察を示していると彼は結論付けています。
既存のAPIは、それが課金の一部であることは確かですが(確かにそれほど重要ではありません)、ストレージの消費に関する洞察はほとんどありません。唯一の情報は集計テーブルのサイズであり、そのデータでさえ同期が数時間ずれている可能性があります。
Amazon まだAPI経由で請求データを公開していません ですが、クリストファーの提案に従って、ある時点でアイテムサイズに関する情報を取得するオプションをDynamoDB APIに追加することを期待しています。
Clarence @ AWSが回答したAmazon開発者フォーラムでこの回答を見つけました。
例えば:-
"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
DynamoDBアイテムサイズを計算するアルゴリズムを、Titan用のDynamoDBストレージバックエンド DynamoDBDelegate クラスで使用できます。
アイテムのサイズは、ハッシュと範囲キー属性を含む、すべての属性のサイズの合計です。属性自体には名前と値があります。名前と値の両方が属性のサイズに影響します。名前のサイズは、文字列値と同じです。すべての値のサイズは、データタイプに基づいて異なります。
重要な詳細に興味がある場合は、 このブログ投稿 を読んでください。
それ以外の場合は、アイテムサイズを正確に決定する DynamoDBアイテムサイズと消費容量計算ツール も作成しました。
数字は簡単にDynamoDBの最も複雑なタイプです。 AWSは、数値のバイト数を判別する方法を公に文書化していません。これは、だれかに縛られることなく、内部の実装を変更できるようにするためです。しかし、彼らが言うことは単純に聞こえますが、実際にはもっと複雑です。
非常に大まかに言えば、式は有効数字2桁ごとに1バイト、プラスの数値には1バイト、マイナスの数値には2バイトのようなものです。したがって、27
は2バイトで、-27
は3バイトです。 DynamoDBは、桁数が不均一な場合に切り上げるため、461
は3バイトを使用します(追加のバイトを含む)。サイズを計算する前に、先頭と末尾のゼロが削除されます。
DynamoDBテーブルのアイテムが占める割合の概算は、boto3ライブラリでget請願を行うことです。
これは、要素のサイズに関する正確な解決策ではありませんが、アイデアの作成に役立ちます。 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
}
}
},
]
...
そこから、それがどれだけの容量ユニットを使用したかを確認でき、アイテムのサイズを概算できます。明らかにこれは、次の事実により、システムの構成に基づいています。
1つの読み取り要求単位は、サイズが最大4 KBのアイテムに対する1つの強く整合性のある読み取り要求、または2つの最終的に整合性のある読み取り要求を表します。トランザクション読み取り要求では、4 KBまでのアイテムに対して1回の読み取りを実行するために2つの読み取り要求ユニットが必要です。 4 KBより大きいアイテムを読み取る必要がある場合、DynamoDBには追加の読み取りリクエストユニットが必要です。必要な読み取りリクエストユニットの総数は、アイテムのサイズと、最終的に一貫性のある読み取りと強い整合性のある読み取りのどちらが必要かによって異なります。