気をつけて!まず、整数は可変長エンコーディングを使用してエンコードされるため、すべての 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 倍のコンパクトさです。(確かに、短いプロパティ名を使用してリスト プロパティのバージョンを少し下げることはできますが、それでもかなり長くなります。)