49

我正在尝试计算 dynamoDB 中项目的大小,但我无法理解定义。

我找到的定义:项目大小是其属性名称和值的长度之和(二进制和 UTF-8 长度)。因此,如果您保持属性名称简短,它会有所帮助。

这是否意味着如果我在数据库中放入一个数字,例如:1 它会占用一个 int 的大小?沿着?双?它会占用与 100 或 1000000 相同的空间,还是只占用相应二进制文件的大小?

String 的计算是什么?

有人知道如何计算吗?

谢谢

4

7 回答 7

39

这确实是一个重要的话题 - 您已经引用了Amazon DynamoDB 数据模型中有些草率的定义:

项目大小是其属性名称和值的长度之和(二进制和 UTF-8 长度)。

这在Amazon DynamoDB 数据类型中的页面下方进行了详细说明:

  • 字符串-字符串是带有 UTF8 二进制编码的 Unicode。
  • 数字-数字是正或负的精确值小数和整数。一个数字在小数点后最多可以有 38 位精度,并且可以在 10^-128 到 10^+126 之间。Amazon DynamoDB 中的表示是可变长度的。前导零和尾随零被修剪。

Amazon DynamoDB 论坛中也提出了一个与您类似的问题(请参阅“数字”类型的好奇性质),Stefano@AWS 的回答更清楚地说明了这个问题:

  • “数字”类型具有 38 位精度这些是实际的十进制数字。所以它可以表示相当大的数字,并且没有精度损失。
  • Number 值占用多少空间?没有太多。我们的内部表示是可变长度,因此大小与值中的实际(相对于最大)位数相关。顺便说一句,前导零和尾随零被修剪。[强调我的]

Christopher Smith 的后续帖子对由此产生的存储消耗及其计算产生的影响提供了更多见解,他总结道:

现有的 API 对存储消耗的了解很少,即使这是计费的一部分(诚然不是那么重要)。唯一的信息是聚合表的大小,甚至这些数据也可能有几个小时不同步。

虽然亚马逊还没有通过 API 公开其计费数据,但他们希望在某个时候添加一个选项来检索有关项目大小的一些信息到 DynamoDB API,正如 Christopher 所建议的那样。

于 2012-01-26T12:19:11.293 回答
12

我在 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

于 2015-09-29T05:10:22.313 回答
5

一个项目的大小是其所有属性大小的总和,包括散列和范围键属性。属性本身具有名称和值。名称和值都会影响属性的大小。名称的大小与字符串值的大小相同。所有值的大小都根据它们的数据类型而不同。

如果您对细节感兴趣,请阅读这篇博文。

否则,我还创建了一个DynamoDB 项目大小和消耗容量计算器,可以准确确定项目大小。

数字很​​容易成为 DynamoDB 中最复杂的类型。AWS 没有公开记录如何确定一个数字中有多少字节。他们说这是为了让他们可以更改内部实现,而无需任何人与之绑定。然而,他们所说的听起来很简单,但在实践中却更加复杂。

但是,非常粗略地说,该公式类似于每 2 个有效数字 1 个字节,加上 1 个额外字节用于正数或 2 个用于负数。因此,27是 2 个字节,又-27是 3 个字节。如果位数不均匀,DynamoDB 将四舍五入,因此461将使用 3 个字节(包括额外的字节)。在计算大小之前修剪前导零和尾随零。

于 2019-01-26T11:32:23.640 回答
4

您可以在 DynamoDB Storage Backend for Titan DynamoDBDelegate类中使用计算 DynamoDB 项目大小的算法。

于 2015-08-20T20:38:28.997 回答
1

以上所有答案都跳过了存储属性长度以及属性名称长度每个属性类型的问题

DynamoDB命名指南名称可以是 1 到 255 个字符长,这意味着1 字节的名称长度开销

我们可以从 400kb 的最大项目限制返回,以了解二进制或字符串项目所需的长度有一个上限——它们不需要存储超过 19 位的长度数字。

使用一些自适应编码,我希望

  • 数字具有 1 字节的前导类型和长度值,但也可以编码为单个字节(例如:零值数字的特殊代码,后面没有值字节
  • 字符串和二进制有 1-3 个字节的前导类型和长度
  • Null 只是一个没有值的类型字节
  • Bool 是一对没有任何其他值的类型字节
  • 集合类型有 1-3 个字节的前导类型和长度。

哦,DynamoDB不是无模式 。它是每项模式,因为它存储了所有这些可变长度项的类型、名称和长度。

于 2020-08-27T07:28:44.240 回答
0

一个项目在您的 DynamoDB 表中占用多少的近似值是使用 boto3 库进行获取请求。

这不是一个元素大小的精确解决方案,但它会帮助你产生一个想法。执行 a 时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 KB 的项目。事务性读取请求需要 2 个读取请求单元才能对高达 4 KB 的项目执行一次读取。如果您需要读取大于 4 KB 的项目,DynamoDB 需要额外的读取请求单位。所需的读取请求单元总数取决于项目大小,以及您想要最终一致还是强一致读取。

于 2018-12-12T18:00:51.057 回答
-1

最简单的方法是在表中创建一个项目并将该项目导出到 csv 文件,这是 DynamoDB 中可用的一个选项。csv 文件的大小将为您提供大约的项目大小。

于 2017-06-12T06:31:31.133 回答