DynamoDB中的ItemSize

时间:2012-01-24 14:21:07

标签: amazon-dynamodb

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

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

这是否意味着如果我在数据库中添加一个数字,例如:1它将采用int的大小?好久不过?一双?是否需要相同的空间量而不是100或1000000,否则它只需要相应二进制文件的大小?

String的计算是什么?

是否有人知道如何计算它?

谢谢

7 个答案:

答案 0 :(得分:38)

这确实是一个非常微不足道的话题 - 你已经从Amazon DynamoDB Data Model中引用了一些有些草率的定义:

  

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

这在Amazon DynamoDB Data Types内的页面下方进一步详细说明:

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

Amazon DynamoDB forum中也提出了与您的问题类似的问题(请参阅Curious nature of the "Number" type),answer from Stefano@AWS更多地了解了这个问题:

  
      
  • “数字”类型有38位精度这些是实际小数   数字。所以它可以代表相当大的数字,而且没有   精确损失。
  •   
  • Number值占用多少空间?不是   许多。 我们的内部表示是可变长度,因此大小为   与值中的实际(与最大)位数相关联。   btw修剪了前导和尾随零。 [强调我的]
  •   

Christopher Smith's follow up post提供了有关存储消费及其计算结果的更多见解,他总结道:

  

现有的API对存储提供的知识很少   消费,即使这是消费的一部分(诚然不是这样)   计费。)唯一的信息是汇总   表格大小,甚至数据可能会有几个小时不同步。

虽然亚马逊does not expose it's billing data via an API yet,但他们希望在某些时候添加一个选项来检索有关项目大小的信息,如Christopher所建议的那样。

答案 1 :(得分:10)

我在亚马逊开发者论坛中找到了这个答案,由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

答案 2 :(得分:3)

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

答案 3 :(得分:2)

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

如果您对具体细节感兴趣,请阅读this blog post

否则,我还创建了一个DynamoDB Item Size and Consumed Capacity Calculator来准确确定商品尺寸。

数字很容易成为DynamoDB最复杂的类型。 AWS并未公开记录如何确定数字中有多少个字节。他们说,这样一来,他们可以更改内部实现,而无需任何约束。他们说的话听起来很简单,但实际上却更复杂。

但是,大致来说,公式类似于每2个有效数字1个字节,加上1个额外的字节表示正数或2个表示负数。因此,27是2个字节,-27是3个字节。如果位数不均匀,DynamoDB将四舍五入,因此461将使用3个字节(包括多余的字节)。在计算大小之前,先修剪前后的零。

答案 4 :(得分:0)

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 KB的项目,一个读取请求单元代表一个高度一致的读取请求或两个最终一致的读取请求。事务性读取请求需要2个读取请求单元才能对最大4 KB的项目执行一次读取。如果您需要读取大于4 KB的项目,则DynamoDB需要其他读取请求单位。所需的读取请求单位总数取决于项目大小,以及您要最终一致性读取还是高度一致性读取。

答案 5 :(得分:0)

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

DynamoDB Naming Guide说,名称的长度可以为1到255个字符 ,这意味着 1个字节的名称长度开销

我们可以从最大400kb的项目限制开始进行工作,以了解二进制或字符串项目所需的长度上限-他们不需要为该长度存储超过19位的数字。

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

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

哦,DynamoDB是不是 无架构。它是 schema-per-item ,因为它存储所有这些可变长度项目的类型,名称和长度。

答案 6 :(得分:-1)

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