0

リスト形式のプロパティを持つモデルを構築したい。

class Data(db.Model):
    listOfIntergers = db.ListProperty(int)
    listOfStrings = db.ListProperty(str)

両方のリストで、値のリストを範囲 <0, 255> に保持したいと考えています。

データ ストア内のインデックス listOfIntergers または listOfStrings を含め、どのプロパティ タイプがより少ないスペースを必要としますか?

str は、文字またはエンコードされた 16 進値、つまり 0 = 0、255 = ff である可能性があると考えてください。

4

1 に答える 1

3

気をつけて!まず、整数は可変長エンコーディングを使用してエンコードされるため、すべての 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 バイトかかります。整数 255 としてのスペース。

このフィールドにインデックスを付ける必要が本当にない限り、適切な解決策はおそらく BlobProperty (リスト/繰り返しプロパティではない) を宣言し、目的のバイト数で構成される単一の文字列を格納することです。

>>> class Data(Model):
...  b = BlobProperty()
... 
>>> d = Data(b=''.join(map(chr, range(100))))
>>> len(d._to_pb().Encode())
133
>>> 

これは、同じ情報量で約 20 倍のコンパクトさです。(確かに、短いプロパティ名を使用してリスト プロパティのバージョンを少し下げることはできますが、それでもかなり長くなります。)

于 2012-07-05T21:33:11.980 に答える