Google app engine 什么属性str或int在Google应用程序引擎(包括索引)中将占据较少的位置
我想用列表形式的属性来构造模型Google app engine 什么属性str或int在Google应用程序引擎(包括索引)中将占据较少的位置,google-app-engine,google-cloud-datastore,Google App Engine,Google Cloud Datastore,我想用列表形式的属性来构造模型 class Data(db.Model): listOfIntergers = db.ListProperty(int) listOfStrings = db.ListProperty(str) 在这两个列表中,我希望将值列表保持在范围内 什么属性类型将占用更少的空间,包括数据存储中的索引列表或字符串列表 考虑到str可以是字符或编码的十六进制值,即0=0,255=ff。小心!首先,整数是使用可变长度编码进行编码的,因此并非所有int64值都占用
class Data(db.Model):
listOfIntergers = db.ListProperty(int)
listOfStrings = db.ListProperty(str)
在这两个列表中,我希望将值列表保持在范围内
什么属性类型将占用更少的空间,包括数据存储中的索引列表或字符串列表
考虑到str可以是字符或编码的十六进制值,即0=0,255=ff。小心!首先,整数是使用可变长度编码进行编码的,因此并非所有int64值都占用8字节——小值占用1-2字节。但是,列表属性的表示形式会重复列表中每个值的属性名称。我使用NDB重写了您的示例(因为从中获取编码protobuf的API更容易记住),并发现以下内容:
>>> from ndb import *
>>> class Data(Model):
... listOfIntegers = IntegerProperty(repeated=True)
... listOfStrings = StringProperty(repeated=True)
...
>>> len(Data()._to_pb().Encode())
20
>>> len(Data(listOfIntegers=[0]*100)._to_pb().Encode())
2420
>>> len(Data(listOfIntegers=[255]*100)._to_pb().Encode())
2520
>>> len(Data(listOfStrings=['\x00']*100)._to_pb().Encode())
2420
但请注意它的欺骗性:值为0的100个整数每个值占用24字节(其中大部分是属性名“listOfIntegers”),而值为255的100个整数每个值占用25字节!这是您的可变长度编码。值“\x00”的100个字符串每个值也需要24个字节——但请注意,“listOfStrings”比“listOfIntegers”短一个字符,因此1字节字符串比整数0多占用1个字节,与整数255占用的空间量相同
除非确实需要对该字段进行索引,否则正确的解决方案可能是声明BlobProperty(不是列表/重复属性)并存储由所需字节数组成的单个字符串
>>> class Data(Model):
... b = BlobProperty()
...
>>> d = Data(b=''.join(map(chr, range(100))))
>>> len(d._to_pb().Encode())
133
>>>
对于相同数量的信息,这几乎是紧凑型的20倍!(无可否认,您可以通过使用较短的属性名来降低列表属性的版本,但仍然要长得多。)小心!首先,整数是使用可变长度编码进行编码的,因此并非所有int64值都占用8字节——小值占用1-2字节。但是,列表属性的表示形式会重复列表中每个值的属性名称。我使用NDB重写了您的示例(因为从中获取编码protobuf的API更容易记住),并发现以下内容:
>>> from ndb import *
>>> class Data(Model):
... listOfIntegers = IntegerProperty(repeated=True)
... listOfStrings = StringProperty(repeated=True)
...
>>> len(Data()._to_pb().Encode())
20
>>> len(Data(listOfIntegers=[0]*100)._to_pb().Encode())
2420
>>> len(Data(listOfIntegers=[255]*100)._to_pb().Encode())
2520
>>> len(Data(listOfStrings=['\x00']*100)._to_pb().Encode())
2420
但请注意它的欺骗性:值为0的100个整数每个值占用24字节(其中大部分是属性名“listOfIntegers”),而值为255的100个整数每个值占用25字节!这是您的可变长度编码。值“\x00”的100个字符串每个值也需要24个字节——但请注意,“listOfStrings”比“listOfIntegers”短一个字符,因此1字节字符串比整数0多占用1个字节,与整数255占用的空间量相同
除非确实需要对该字段进行索引,否则正确的解决方案可能是声明BlobProperty(不是列表/重复属性)并存储由所需字节数组成的单个字符串
>>> class Data(Model):
... b = BlobProperty()
...
>>> d = Data(b=''.join(map(chr, range(100))))
>>> len(d._to_pb().Encode())
133
>>>
对于相同数量的信息,这几乎是紧凑型的20倍!(无可否认,您可以通过使用较短的属性名来降低列表属性的版本,但仍然需要更长的时间。)您可能会发现这很有用,比str短4倍,比integer好用。您可能会发现这很有用,比str短4倍,比integer好用。我需要在这上面建立索引,以便快速搜索数千条记录:)感谢您提供了非常好的建议和代码示例-这正是我需要的。我之前读过一些简化的文章,其中尺寸计算几乎没有过时。我发现了一些限制我使用listOfString的bug,因为SDK不接受db中的[chr(x)for x in range(255)]。ListProperty(str)-需要使用db,因为遗留代码。您可以使用db.ListProperty(db.Blob)。请注意,范围(255)可能是错误的--它缺少最后一个字符。谢谢,我将尝试db.Blob-如果它将被索引的话,最好的字节数-是的范围(255)拼写错误应该是范围(256):)我需要在这个上建立索引以快速搜索数千条记录:)感谢非常好的建议和代码示例-这就是我需要的。我之前读过一些简化的文章,其中尺寸计算几乎没有过时。我发现了一些限制我使用listOfString的bug,因为SDK不接受db中的[chr(x)for x in range(255)]。ListProperty(str)-需要使用db,因为遗留代码。您可以使用db.ListProperty(db.Blob)。请注意,范围(255)可能是错误的--它缺少最后一个字符。谢谢,我将尝试db.Blob-如果它将被索引,则字节的最佳值-是范围(255)拼写错误,应该是范围(256):)