Ich benutze die neue experimentelle Task-Warteschlange für Java-Appengine und versuche, Aufgaben zu erstellen, die Statistiken in meinem Datenspeicher zusammenfassen. Ich versuche, die Anzahl der UNIQUE-Werte in allen Entitäten (eines bestimmten Typs) in meinem Datenspeicher zu zählen. Genauer gesagt, sagen wir, Entität vom Typ X hat ein Feld A. Ich möchte die Anzahl der eindeutigen Werte von A in meinem Datenspeicher zählen.
Mein aktueller Ansatz besteht darin, eine Task zu erstellen, die die ersten 10 Entitäten des Typs X abfragt, eine Hashtabelle erstellt, in der die eindeutigen Werte von A gespeichert werden, und diese Hashtabelle dann an die nächste Task als Nutzlast weiterleitet. Diese nächste Aufgabe zählt die nächsten 10 Entitäten und so weiter, bis ich alle Entitäten durchlaufen habe. Während der Ausführung der letzten Aufgabe zähle ich die Anzahl der Schlüssel in meiner Hashtabelle (die von Aufgabe zu Aufgabe weitergegeben wurde), um die Gesamtanzahl der eindeutigen Werte von A zu finden.
Dies funktioniert für eine kleine Anzahl von Entitäten in meinem Datenspeicher. Aber ich bin besorgt, dass diese Hashtabelle zu groß werden wird, wenn ich viele einzigartige Werte habe. Was ist die maximal zulässige Größe für die Payload einer Appengine-Aufgabe ?????
Können Sie irgendwelche alternativen Ansätze vorschlagen?
Danke.
Laut den Dokumenten beträgt die maximale Größe des Aufgabenobjekts 100 KB .
"Können Sie alternative Ansätze vorschlagen?".
Erstellen Sie für jeden eindeutigen Wert eine Entität, indem Sie basierend auf dem Wert einen Schlüssel erstellen und Model.get_or_insert
verwenden. Dann Query.count
up die Entitäten in Chargen von 1000 (oder wie viele Sie zählen können, bevor Ihre Anfrage Timeout - mehr als 10), mit den normalen Paging-Tricks.
Oder verwenden Sie einen ähnlichen Code wie in den Dokumenten für get_or_insert
, um die Zählung beizubehalten - App Engine-Transaktionen können mehrmals ausgeführt werden, sodass eine in der Transaktion erhöhte Memcached-Zählung unzuverlässig wäre. Es könnte jedoch ein Trick dabei sein, oder Sie könnten die Zählung im Datenspeicher behalten, vorausgesetzt, Sie machen mit Entity-Eltern nichts Unangenehmes.
Das ist vielleicht zu spät, aber vielleicht kann es nützlich sein. Wann immer Sie eine entfernte Chance haben, seriell durch eine Reihe von Entitäten gehen zu wollen, schlagen Sie vor, entweder ein date_created- oder date_modified-auto_update-Feld zu verwenden, das indiziert ist. Ab diesem Punkt können Sie ein Modell mit einer TextProperty erstellen, um Ihre Hash-Tabelle mit json.dumps () zu speichern. Sie müssen lediglich das letzte verarbeitete Datum und die Modell-ID für die Hash-Tabellen-Entität übergeben. Führen Sie eine Abfrage mit date_created später als das letzte Datum, json_load () die TextProperty durch, und akkumulieren Sie die nächsten 10 Datensätze. Könnte etwas komplizierter werden (z. B. handle date_created-Kollisionen durch Verwenden der übergebenen Parameter und eines etwas anderen Abfrageansatzes). Fügen Sie der nächsten Aufgabe einen 1-Sekunden-Countdown hinzu, um Probleme bei der schnellen Aktualisierung der Hashtabelleneinheit zu vermeiden. HTH, -stevep
Tags und Links java google-app-engine scheduled-tasks payload