Löschen von Daten aus der App-Engine

8

Ich habe ein beliebtes soziales Spiel, bei dem ich jede Benutzeraktion als Event-Entität im Datenspeicher hinterlegte und dann diese Ereignisse einmal pro Tag aus GAE zur Verarbeitung exportierte. Jetzt möchte ich alle diese Elemente aus dem Datenspeicher löschen, alle 300 Millionen davon.

Ich habe den "datastore admin" dafür verwendet. In den ersten Stunden ließ ich es laufen, es schaffte, ungefähr 2 Millionen Entitäten zu löschen und $ 10 von CPU zu verwenden, um dies zu tun. Es scheint also 1500 $ zu kosten, nur um dieses Löschen auszuführen. Ich fange an zu denken, dass es besser wäre, wenn ich einfach die gesamte Anwendung lösche und Elemente kopiere, die ich nicht löschen möchte.

Andere Optionen?

Aktualisieren

Ich habe Ratschläge zu #appengine im IRC bekommen, dass es einfach billiger ist, die Schlüssel von 2000 Entities gleichzeitig zu verwenden und Tasks zu erstellen, um sie in Stücken zu löschen (kann Schlüssel als Strings an Tasks übergeben) als das Datastore Admin Tool. Ich versuche das jetzt und werde versuchen, mich daran zu erinnern, morgen zurück zu berichten, ob das billiger zu sein scheint oder nicht.

    
Bemmu 09.03.2011, 21:37
quelle

6 Antworten

3

Durch das Entfernen von Indizes werden die Kosten für das Löschen von Datensätzen erheblich reduziert. Sie können auch Ihre Löschrate begrenzen, um unter den 6,5 CPU-Stunden pro Tag zu bleiben, die Sie kostenlos erhalten, um nicht zu bezahlen.

Wenn Sie das Löschen selbst durchführen, ist es unwahrscheinlich, dass Sie es effizienter ausführen können als das Datenspeicher-Admin-Tool, das bereits Abfragen nur für Schlüssel und Cursor verwendet.

    
Nick Johnson 10.03.2011, 18:00
quelle
3

Vorausgesetzt, Ihr Ziel besteht darin, die kostengünstigsten Kosten zu entfernen, anstatt die Migration zu planen, würde ich eine selbstgesteuerte Aufgabe starten, die bei jedem Lauf mehrere hunderttausend Schlüssel aufräumt und sich dann neu plant. Ich würde diese Aufgabe in einer separaten Warteschlange absichtlich drosseln, so dass die Aufgabe nur oft genug ausgeführt wurde, um meine täglichen freien Quoten möglichst nicht zu überschreiten.

Wenn Sie "akzeptable" CPU-Kosten pro Tag haben, mit denen Sie gerne leben würden, könnten Sie die Warteschlange weniger drosseln, so wie es besser wäre, wenn jedes Löschen nicht zu lange dauert wirkt sich nicht zu stark auf die Instanzlatenz aus.

Kevpies Kommentar zum Staubsaugen kann auch relevant sein, wenn Sie zusammengesetzte Indizes haben.

    
MC78 10.03.2011 13:12
quelle
1

Ich bin auf dieses Problem gestoßen, als ich eine neue App entwickelt habe, die nicht immer selbst aufgeräumt hat. Nach mehreren Experimenten war das, was ich gelernt habe,

  1. Stellen Sie die Anzahl der Löschungen so ein, dass Sie so viele wie möglich ausführen, ohne dass Zeitüberschreitungen auftreten. Für mich waren das ungefähr 200 Einheiten pro Stück, obwohl ich manchmal mit 400 davonkommen konnte, aber nie mehr.

  2. Wenn Sie so abfragen können, dass Sie nur die Schlüssel erhalten, ist es effizienter.

  3. Meine größten Effizienzgewinne ergaben sich durch die Verwendung von Abfragecursors . Dies ermöglichte effizientere Abfragen mit größeren Chunk-Größen.

  4. Verwenden Sie die Zeitplanung, um den Schmerz zu verbreiten. Dies kann automatische Cron-Planung oder manuelle Planung sein. Da mein Projekt noch Alpha war, würde ich meine Quoten spät am Abend überprüfen und ungenutzte Kontingente löschen, indem ich meine Löschaufgaben manuell starte.

  5. Beschweren Sie sich bei Google. Dies hatte den Effekt, dass ich mich besser fühlte.

Glenn 11.03.2011 18:47
quelle
0

Sie meinen, dass Sie GQL im Datenspeicher-Admin verwendet haben? Wie, delete from x... ? Und das war zu teuer? Hmmm ...

Nun, Sie können etwas Geld sparen, wenn Sie das Löschen in Ihren Laufzeitcode integrieren. Wenn also ein Benutzer angemeldet ist, greifen Sie bereits auf die Datenbank zu, vermutlich mit den gleichen Indizes. Warum also nicht löschen? Sie würden mit weniger Gesamttransaktionen enden, wenn Sie es richtig machen.

    
Ken Kinder 09.03.2011 21:46
quelle
0

Fragen. - Sind Ihre Event-Entitäten in Entitätsgruppen gruppiert? - Wie viele Indizes haben Sie? Irgendwelche zusammengesetzten? - Wie viele Eigenschaften, die nicht indiziert sind = False?

Nur versuchen, die Kosten für ein Löschen zu ermitteln.

Möglicherweise können Sie einige Ihrer Indizes leeren, bevor Sie mit dem Löschen der Entitäten beginnen.

    
kevpie 10.03.2011 08:24
quelle
0

Versuchen Sie, über remote_api zu löschen. Es wird den Verbrauch von CPU-Stunden in hohem Maße reduzieren Ссылка

    
Sam 14.03.2011 02:36
quelle

Tags und Links