4

Johan Euphrosine によるこのプレゼンテーションのような複数の情報源によると、AppEngine はプロパティ名をデータとインデックスと共に保存します。このため、ディスクのスペースを節約するために、データストア内の種類とプロパティ名の短縮版を使用しています。

@Entity("p")
public class PersistentClass {

    @Property("n")
    private String name;

}

このエンティティのインデックス エントリは、次の行になります。

PersistentClass:1
PersistentClass:name:foo:PersistentClass:1

(短縮されたプロパティ名を適用する)と比較して:

p:1
p:n:foo:p:1

これは 73% の圧縮率ですが、これは理論的な演習であり、プラットフォームに関する内部知識がなければ先に進むのは困難です。私の質問は次のとおりです。これは一般的な慣行ですか?NoSQL、特に AppEngine で保存された短縮されたプロパティ名の節約を測定した人はいますか?

4

3 に答える 3

3

この質問に答える最も簡単な方法は、おそらく簡単なテストです。サンプル アプリケーションを Gist ( https://gist.github.com/jeremydw/7201456 ) に投げ込み、長いプロパティ名を持つモデルの 2000 エンティティと、単一のモデルの 2000 エンティティの作成をテストしました。 -文字プロパティ名。

データストア統計モジュール ( https://developers.google.com/appengine/docs/python/datastore/stats ) を使用すると、プロパティ名が長いほど多くのディスク容量が必要になることが確認されます。(この特定の実験では 278KB です。) 興味深いテストとして、エンティティの作成または取得にかかる時間を測定することもできます。これは、アプリケーションの速度にも影響を与えるからです。

以下は、1 回のテストの結果です。

name: l_PersistentClass2, bytes: 1507635
name: super_very_long_property_name_PersistentClass1, bytes: 1787607
difference: 279972 bytes
于 2013-10-28T18:05:34.260 に答える
2

それは何も悪いことではありません - これは完全に受け入れられる慣習であるべきです。

実際にお金を節約できるかどうかは別の問題です。もちろん、これは完全にアプリに依存しますが、最大の費用は DB 操作と帯域幅です。2 年間の運用後 (常にデータを保存)、データ ストレージの総費用は総費用のわずか 5% です。

これが実際に総 GAE コストに意味のある影響を与えるかどうかを確認するために、実際に少し計算を行う必要があります。

于 2013-10-28T18:07:52.100 に答える
0

はい、これは一般的に良い考えです。

これはおそらくインデックスにほとんど影響を与えません。インデックスが実際にすべてのインデックス エントリにプロパティ名を使用するとは思いません。

ただし、プロパティ名は格納されているすべてのエンティティで使用されます。今は数字を持っていませんが、約 80 の整数プロパティを持つエンティティでテストを実行しました。この場合、長いプロパティ名は実際の整数値よりも大きなオーバーヘッドであり、1 文字または 2 文字のプロパティ名を使用すると、エンティティのサイズが大幅に縮小されました。

ただし、これらのエンティティは数千しか保存されていなかったため、実際のコストへの影響は最小限でした。しかし、データストア ビューでこれらのエンティティを表示するたびに、ソース コードを表示して、どのプロパティがどれであるかを判断する必要があります。

于 2013-10-28T18:53:26.460 に答える