1つのエンティティにプロパティをいくつまで作れるか |
1つのエンティティにプロパティをいくつまで作れるか(パート2) |
前回、1つのエンティティにプロパティをいくつまで作ることができるのか検証してみました。 その結果、GAE上のデータストアではsetProperty(インデックス有りのプロパティをセット)を使うと20000個まで追加でき、setUnindexedProperty(インデックス無しのプロパティをセット)を使うと、1MB未満で使えました。 また、ローカルでもsetPropertyで検証し、GAEでのsetUnindexedPropertyに近しい個数のプロパティを追加できることが分かりました。ところが、ローカルでのunindexedPropertyを検証していなかった為、今回検証してローカル環境とGAE環境のプロパティ最大数を比較してみたいと思います。検証方法は、前回の方法でプログラムを使用して検証しました。
プロパティ数最大値 | ローカル環境 | GAEデータストア環境 |
indexedProperty | 1MB以下(前回の表2) | 20000個まで * |
unindexedProperty | 1MB以下(前回の表3) |
表1.環境別・インデックス有無のプロパティ最大数
*実はGAEデータストアの20000個の制限は公式ドキュメントに書いてありました。 https://developers.google.com/appengine/docs/java/datastore/?hl=ja
目次
ローカル環境でのunindexedPropertyの検証結果
ローカル環境のデータストアでsetUnindexedPropertyを使用すると、6つのケースの保存できるプロパティ最大数は表2のようになりました。
ケース名 | 型と桁数 | 値 | 保存できるプロパティ最大数 |
ケース1 | String型1文字 | a | 75170 |
ケース2 | int型1桁 | 1 | 80953 |
ケース3 | byte型1桁 | 1 | 80953 |
ケース4 | boolean型 | TRUE/FALSE | 80953 |
ケース5 | 0件のList型 | 95670 | |
ケース6 | null値のText型 | 95672 |
表2.ケース別のプロパティ最大数(ローカル環境でのunindexProperty)
前回の表2と表3とを比べるために、以下の通り表3を作りました。 ローカル環境では、indexedProperty(インデックスを使用する場合)とunindexedProperty(インデックスを使用しない場合)のどのケースもプロパティ数は同じでした。 また、前回の表2と表3を付け足した表3を確認しますと、全てのケースではローカル環境のプロパティ最大数 > GAE環境のプロパティ最大数という関係を保っていました。 ローカル環境のプロパティ最大数 > GAE環境のプロパティ最大数という関係だったので、どうもGAE環境では、ローカルでは保存しない何かをエンティティに付与しているように見えます。
ケース名 | 型と桁数 | 値 | GAE(インデックスを使用しない場合) | ローカル(インデックスを使用しない場合) | ローカル(インデックスを使用する場合) |
ケース1 | String型1文字 | a | 75169 | 75170 | 75170 |
ケース2 | int型1桁 | 1 | 80951 | 80953 | 80953 |
ケース3 | byte型1桁 | 1 | 80951 | 80953 | 80953 |
ケース4 | boolean型 | false | 80951 | 80953 | 80953 |
ケース5 | 0件のList型 | 95669 | 95670 | 95670 | |
ケース6 | null値のText型 | 95669 | 95672 | 95672 |
表3.ケース別の全てのパターンでのプロパティ最大数
前回の続きの検証は以上ですが、 これだけだと物足りないと思いますので少し別の側面から細かい検証をしようと思います。
カインド名とプロパティ名の長さによる検証
前回検証用に使ったプロパティ名は統一していましたが、プロパティ名やカインド名の長さによっても変わるのではないかと想像しており、長さによって保存できる数は変わるのか検証してみたいと思います。
- 作成できるプロパティの数は、プロパティ名の長さに影響するのかどうか
- 作成できるプロパティの数は、カインド名の長さに影響するのかどうか
カインド名とプロパティ名のケース別検証パターン
前回同様、検証パターンを用意しました。プロパティ名の数字5桁は00000~99999までの数字を自動採番します。値は、コンスタントに文字a(英数字1文字)にしました。
カインド名 | プロパティ名 | |
ケース1 | 英数字5文字 | 英数字5文字+数字5桁 |
ケース2 | 英数字10文字 | 英数字5文字+数字5桁 |
ケース3 | 英数字15文字 | 英数字5文字+数字5桁 |
ケース4 | 英数字5文字 | 英数字10文字+数字5桁 |
ケース5 | 英数字5文字 | 英数字15文字+数字5桁 |
ケース6 | 英数字5文字 | 英数字20文字+数字5桁 |
表4.カインド名とプロパティ名のケース別定義
ケース1~ケース3はプロパティ名を長さ14で一定に、カインド名の長さを7、9、11と増やしています。それとは逆にケース4~ケース6はカインド名を長さ7で一定に、プロパティ名の長さを9、12、15と増やしています。 もしプロパティ名、カインド名の長さによって保存できるプロパティ数が変化すれば、1つのエンティティにはプロパティ名やカインド名が常にエンティティの中にあることになり、データストアはプロパティ名をメタとして持っていないことになります。(RDB的じゃないですね…)
検証方法
こちらも前回と同様、プログラムを用いて最大値を決定します。今回の実験は、ローカルとGAE両方の環境で実験します。
作成できるプロパティ数の最大個数の検証結果
ケース1~ケース6について表5のような結果が得られました。(※表5の各項目名の括弧内の記号は、表6で使います)
カインド名長(A) | プロパティ名長(B) | 値のバイト数(C) | 作成できる最大プロパティ数 | |
ケース1 | 英数字5文字 | 英数字10文字 | 1 | 49929個 |
ケース2 | 英数字10文字 | 英数字10文字 | 1 | 49928個 |
ケース3 | 英数字15文字 | 英数字10文字 | 1 | 49928個 |
ケース4 | 英数字5文字 | 英数字15文字 | 1 | 40327個 |
ケース5 | 英数字5文字 | 英数字20文字 | 1 | 33823個 |
ケース6 | 英数字5文字 | 英数字25文字 | 1 | 29125個 |
表5.カインド名とプロパティ名のケース別最大プロパティ数
ケース1~ケース3まで作成できる最大プロパティ数も、ケース4~ケース6まで作成できる最大プロパティ数も名前長を増加すると減少しました。 減少の傾向ですが、ケース1~ケース3まで作成できる最大プロパティ数よりも、ケース4~ケース6まで作成できる最大プロパティ数の方が鋭化していました。この結果から、エンティティには常にカインド名とプロパティ名が含まれているようです。また、1エンティティ当たりカインド名1件とプロパティ名全件と値を持っている配分になります。
表5から1プロパティ当たりのメタデータサイズを算出
表5の結果から1プロパティ当たりのサイズ(E)を算出しました。さらにこのE値にプロパティ名と値の合計バイト数(F)を引くと、1エンティティ当たりのプロパティ名と値以外のデータのバイト数が算出できました。それを表の差(E-F)にまとめましたが、1プロパティ当たり約10バイトでほぼ一定であることが分かります。
作成できる最大プロパティ数(D) | 1プロパティ当たりのサイズE(1024×1024÷D) | プロパティ名と値の合計サイズF(B+C) | 差(E-F) | |
ケース1 | 49929 | 21.00134191 | 11 | 10.00134191 |
ケース2 | 49928 | 21.00176254 | 11 | 10.00176254 |
ケース3 | 49928 | 21.00176254 | 11 | 10.00176254 |
ケース4 | 40327 | 26.001835 | 16 | 10.001835 |
ケース5 | 33823 | 31.00186264 | 21 | 10.00186264 |
ケース6 | 29125 | 36.00260944 | 26 | 10.00260944 |
表6.1プロパティ当たりのメタデータのサイズ
この一定の10バイトのサイズは、メタデータとして使用されているのではないかと思われます。
まとめ
- GAEのデータストアではインデックスを作成する場合、プロパティ数の制限がありますが、ローカル環境ではインデックスを無視する動きをします。
- カインド名・プロパティ名の長さによって保存できるプロパティ数も変わります。また、1エンティティ当たりカインド名1件とプロパティ名と値という構成になっています。
- 文字列1プロパティ当たり10バイト分のサイズが、オーバヘッドとして使用されているようです。
1プロパティ当たりのオーバヘッドとして10バイト必要そうであることが分かりました。次回(パート3)では、その検証と1カインド当たりのオーバヘッドのサイズを検証してみたいと思います。
1つのエンティティにプロパティをいくつまで作れるか |
1つのエンティティにプロパティをいくつまで作れるか(パート2) |