2009-03-04 12 views
10

Chcę zaimplementować najlepsze wyniki w Internecie dla mojej gry. I powiedz graczom, które miejsce mają (nie tylko top100 lub coś podobnego). W normalnym SQL wyglądałby tak:Jak zaimplementować najlepsze wyniki w Internecie w Google App Engine

SELECT COUNT (*) FROM żywo GDZIE Punkty>: newUsersPoints

i GQL mają coś podobnego

db.GqlQuery ("SELECT * FROM wynik GDZIE punkty >: 1 ", newUsersPoints) .count()

, ale ponieważ count() jest ograniczone tylko do 1000, nie będzie bardzo przydatne w moim przypadku. Czy masz jakieś pomysły, jak to wdrożyć?

mam dwa

pierwsze:

  1. Wykorzystanie Liczniki fragmentowanie pomysł (http://code.google.com/intl/pl/appengine/articles/sharding_counters.html) Utwórz nowe "stół", który przechowuje ile wyniki są w pewnym zakresie (from_points, to_points)

  2. Podsumuj wszystkie liczniki z powyższej tabeli, gdzie range.to_points < newUsersPoints

  3. Znajdź, ile wyników jest większych niż wyniki w zakresie, w którym nowy wynik to db.GqlQuery ("WYBIERZ * Z WYGRANY WHERE points>: 1 AND points> =: 2 AND points <: 3", newUsersPoints, range.from_points , range.to_points) .count() + sumfrom2

  4. zakres Wyszukiwanie w którym nowy wynik i zwiększyć jego przeciw

  5. podziału zakresów którym licznik jest większa niż 1000 (lub 999), tak aby 3. wouldn 't osiągnie limit

  6. Dodaj nowy wynik do tabeli wyników

Co jest dość skomplikowane i podatne na błędy. Przed dodaniem wyniku możemy zwiększyć zakres i Czas oczekiwania. (Nie transakcyjna)

Drugi pomysł:

Od czasu do czasu (? Raz dziennie) Sortuj wszystkie wyniki poprzez punkty i dać im nowe pozycje (skrypt może timeout więc musimy to zrobić w kawałki)

Aby dowiedzieć się, w którym miejscu nowy wynik jest po prostu zrobić

db.GqlQuery ("SELECT * FROM wynik GDZIE punktów>: 1 LIMIT 1", newUsersPoints). .get() precalculated_position + 1

Jakieś inne pomysły?

Odpowiedz

4

Ten numer thread on the google-appengine group prawdopodobnie będzie interesujący. Wygląda na to, że istnieje biblioteka, specjalnie dla tego.

Zasadniczo brzmi to jak coś podobnego do sharded counters.

5

Zaimplementowałem Rankera w kilku aplikacjach GAE. Są to aplikacje na Facebooku, które mają od tysięcy do setek tysięcy osób. To działa dobrze, ale do moich celów ma jedną wielką wadę: trzeba zadeklarować z góry ostateczny zakres, w którym zdobędzie uczestnika będzie spadek Więc to jest złe z dwóch powodów.

  1. jeśli masz konkurs bez końca, w którym wyniki ludzi mogą wspinać się bez górnej granicy, jesteś obręcz.

  2. na początku konkursu, gdy wszyscy są zgrupowani w pobliżu zera, struktura drzewa używana przez ranker.py nie jest wydajna. drzewo idzie bardzo głęboko i wykorzystuje zaledwie jedną z jego szerokości.

Innymi słowy, ranking rank.py jest doskonały w przypadku, gdy masz zawodników, których wyniki są losowo rozdzielane w równomierny sposób na znanym zakresie wartości. W przypadku innych zastosowań jest on mniejszy niż optymalny.

Mam nadzieję, że wkrótce opracuję bardziej ogólnie przydatny silnik rankingowy. Z pewnością zaktualizuje ten wątek, gdy to się stanie!