Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine 什么属性str或int在Google应用程序引擎(包括索引)中将占据较少的位置_Google App Engine_Google Cloud Datastore - Fatal编程技术网

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):)