*

1つのエンティティにプロパティをいくつまで作れるか(パート2)

公開日: : 最終更新日:2015/04/17 投稿者: Cloud Datastore, GAE

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)

関連記事

1つのエンティティにプロパティをいくつまで作れるか

1つのエンティティにプロパティをいくつまで作れるか 1つのエンティティにプロパティをいくつまで

記事を読む

GAEでよくあるエラーの発生原因と対策1

GAE上で動くWebアプリケーションに特有の例外について、弊社での運用の事例からいくつか特徴的なもの

記事を読む

Search API詳細解説 Part2「Search APIの使い方 登録・削除編」

Search API詳細解説シリーズ タイトル Part1Search API 概要説明

記事を読む

Search API詳細解説 Part6「Search API 詳細 限界値編」

みなさん、こんにちは。 前回はSearch APIの反映速度について調べてみましたが、いかがだった

記事を読む

GAEのスケーリング 後編 <最適化の実践>

この記事では、こちらの公式ドキュメントをもとに、GAEのスケーリングの仕組みと最適化のやり方について

記事を読む

たった1つのCloud SQLインスタンスで複数のWordPressを動かす

皆様こんにちは。 前回はCloudSQLやCloud Storageを用いてWordpress

記事を読む

Search API詳細解説 Part3「Search APIの使い方 検索編」

Search API詳細解説シリーズ タイトル Part1Search API 概要説明

記事を読む

GCP愛を語る

RGCP(GCP好き以外お断り) 技術的な話ばかりの中のAdventCalendarですが、本

記事を読む

これで怖くない Datastore のトランザクション

”トランザクション” 聞いただけで嫌厭する方も少なくないのでは? Datastore のトランザ

記事を読む

Datastoreモデル変更の影響調査

GoogleAppEngine(以下GAEと呼称)に限らず、開発を行なっていると『テーブルの構造を変

記事を読む

PAGE TOP ↑