App Engine: 13 StringPropertys vs. 1 StringListProperty (w.r.t. Indexierungs / Speicherung und Abfrage-Leistung)

StackOverflow https://stackoverflow.com/questions/1220794

Frage

Ein bisschen Hintergrund zuerst: GeoModel ist eine Bibliothek, die ich schrieb, dass fügt sehr einfach geospatial Indizierung und Abfragefunktionalität App Engine-Anwendungen. Es ist ähnlich wie in Ansatz zu geohashing. Die äquivalente Lage Hash in GeoModel ist a 'GEOCELL' genannt.

Derzeit ist die GeoModel Bibliothek fügt 13 Objekte (location_geocell__n_, n = 1..13) an jedem Standort-aware Einheit. Zum Beispiel kann ein Unternehmen Eigenschaftswert hat, wie:

location_geocell_1 = 'a'
location_geocell_2 = 'a3'
location_geocell_3 = 'a3f'
...

Dies ist erforderlich, um nicht eine Ungleichheit Filter während räumlicher Abfragen aufbrauchen.

Das Problem mit dem Ansatz 13-Eigenschaften ist, dass für jede geo Abfrage einer App, 13 neue Indizes ausführen mag, müssen definiert und gebaut werden. Dies ist definitiv eine Wartung Ärger, da ich habe gerade schmerzlich realisiert, während die Demo-Anwendung für das Projekt neu zu schreiben. Dies führt zu meiner ersten Frage:

FRAGE 1: Gibt es einen erheblichen Speicheraufwand pro Index? das heißt, wenn ich 13 Indizes mit n Einheiten in jeweils gegenüber 1-Index mit 13n Einheiten darin, die erstere ist viel schlimmer als diese in Bezug auf die Lagerung?

Es scheint, wie die Antwort auf (1) nicht, pro dieser Artikel , aber ich möchte nur sehen, ob jemand eine andere Erfahrung gemacht hat.

Nun, ich angesichts der GeoModel Bibliothek so eingestellt wird, dass anstelle von 13-String-Eigenschaften gibt es nur eine StringListProperty genannt location_geocells sein würde, das heißt:.

location_geocells = ['a', 'a3', 'a3f']

Dies führt zu einem viel sauberen index.yaml. Aber ich tun, um die Auswirkungen auf die Leistung in Frage:

FRAGE 2: Wenn ich von 13 String Eigenschaften 1 StringListProperty wechseln, wird die Abfrageleistung negativ beeinflusst werden; meine aktuellen Filter wie folgt aussehen:

query.filter('location_geocell_%d =' % len(search_cell), search_cell)

und der neue Filter würde wie folgt aussehen:

query.filter('location_geocells =', search_cell)

Beachten Sie, dass die erste Abfrage einen Suchraum von _N_ Einheiten hat, während die zweite Abfrage einen Suchraum von _13n_ Einheiten hat.

Es scheint, wie die Antwort auf (2) ist, dass sowohl Ergebnis in gleicher Abfrageleistung pro Tipp # 6 in diese Blog-Post , aber auch hier würde ich gerne sehen, wenn jemand irgendwelche unterschiedliche reale Welt Erfahrungen mit diesem hat.

Schließlich, wenn jemand irgendwelche anderen Vorschläge oder Hinweise hat, die Speicherauslastung, die Abfrageleistung und / oder Benutzerfreundlichkeit helfen können (insbesondere w.r.t. index.yaml) zu verbessern, bitte lass es mich wissen! Die Quelle finden Sie hier Geomodells & geomodel.py

War es hilfreich?

Lösung

Sie haben Recht, dass es keine signifikanten Aufwand pro-Index - 13n Einträge in einem Index mehr oder weniger entspricht n Einträge in 13 Indizes. Es gibt eine Gesamt Indexzählwert Grenze von 100, obwohl, so dass diese isst einen erheblichen Teil der verfügbaren Indizes auf.

Das heißt, ein Listproperty verwendet, ist auf jeden Fall eine weit überlegene Ansatz von Usability und Index Verbrauch Perspektiven. Es ist, wie Sie kein Performance-Unterschied zwischen einem kleinen Index und einem viel größeren Index abfragen sollten, vorausgesetzt, beiden Abfragen gibt die gleiche Anzahl von Zeilen.

Der einzige Grund, warum ich von für die Verwendung von separaten Eigenschaften denken kann, ist, wenn Sie wüssten, dass Sie nur zu indizieren benötigen auf bestimmte Detailebene - aber das erreicht besser zu Einsatz-Zeit werden könnte, indem die Detailebene Angabe Sie die hinzugefügt werden sollen Liste an erster Stelle.

Beachten Sie, dass in jedem Fall nur Sie die Indizes müssen, wenn Sie die geocell Eigenschaften in Verbindung mit einer Sortierreihenfolge oder Ungleichheit Filter abfragen möchten, obwohl -. In allen anderen Fällen wird die automatische Indexierung genügen

Andere Tipps

  
    

Schließlich, wenn jemand irgendwelche anderen Vorschläge oder Tipps, die Verbesserung der Speicherauslastung, die Abfrageleistung und / oder einfache Bedienung

helfen kann   

Die StringListproperty ist der Weg für den oben genannten Gründen zu gehen, aber in der tatsächlichen Nutzung könnte man die Geozellen zu denen hinzufügen möchten besitzen bereits vorhandene String so eine gegen mehrere Eigenschaften abfragen könnte.

Wenn Sie also ein niedrigeres Niveau api schaffen waren, konnten sie mit Volltextsuche Implementierungen funktionieren wie bill Katzs

def point2StringList(Point, stub="blah"):
    .....
    return ["blah_1:a", "blah_2":"a3", "blah_3":"a3f" ....]

def boundingbox2Wheresnippet(Box, stringlist="words", stub="blah"):
    .....
    return "words='%s_3:a3f' AND words='%s_3:b4g' ..." %(stub)

etc.

Sieht aus wie Sie mit 13 Indizes beendet, weil Sie in Hex-codiert (für die menschliche Lesbarkeit / Karten-Stufen?). Wenn Sie volles Potenzial eines Bytes (ByteString) verwendet hatten, würden Sie 256 Zellen haben statt 16 Zellen pro Zeichen (Byte). Dort für die gleiche Genauigkeit zu weit geringerer Anzahl von Indizes zu reduzieren.

  

ByteString ist nur eine Unterklasse einer str und ist indiziert ähnlich, wenn weniger als 500 Bytes lang sein.

Allerdings Anzahl der Ebenen könnte niedriger sein; mir 4 oder 5 Stufen sind praktisch gut genug für die meisten Situationen auf ‚die Erde‘. Für einen größeren Planeten oder bei jedem Sandpartikel zu katalogisieren, könnten mehr Teilungen ohnehin müssen unabhängig von Codierung eingeführt werden verwendet. In beiden Fällen ByteString ist besser als Hex-Codierung. Und hilft Indizierung reduzieren wesentlich .

  • Zur Darstellung 4000000000 niedrig (est) Ebene Zellen, alles, was wir brauchen, ist 4 Bytes oder nur 4-Indizes . (Von grundlegenden Computer Bogen oder Speicheradressierung).
  • Für das gleiche darstellen, wir bräuchten 16 hexadezimale Ziffern oder 16 Indizes .

ich könnte falsch sein. Kann die Anzahl der Indexstufen passende Karte Zoomstufen wichtiger sind. Bitte korrigieren Sie mich. Habe vor, dies statt hex zu versuchen, wenn nur eine (andere) Person hier dieses sinnvoll findet:)

oder eine Lösung, die weniger große Zellen (16), aber mehr (128.256), da wir die Hierarchie nach unten gehen hat. Irgendwelche Gedanken?

Beispiel:

  • [0-15] [0-31] [0-63] [0-127] [0-255] gibt 1G niedriges Niveau Zellen mit 5 Indizes mit log2 Abnahme in der Größe.
  • [0-15] [0-63] [0-255] [0-255] [0-255] gibt 16G niedriges Niveau Zellen mit 5 Indizes.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top