jak sa sprawdzane punkty w projekcie miesiaca?

Zaczęty przez skowron, 08 Styczeń 2009, 13:09

skowron

hej!

pytanie jak w temacie, w sumie zdziwilem sie bo za obecny projekt miesiaca (styczen 09) juz jakies punkty mam nie wiele ale sa ;) natomiast w podsumowaniu na forum B@PL pokazuje nadal ze nie mam punktow

w sumie zdziwilem sie troche stad tez sie pytam
(nie ze zbieram magiczne punkty tylko ciekawosc ;) i mam  nadzieje ze znajdzie sie ktos kto bedize mi to w stanie wytlumaczyc  )

pozdrawiam
Skowron

Pigu

do klasyfikacji w projekcie miesiąca są brane punkty uzyskane przez członków teamu tylko podczas tego miesiąca

skowron

Cytat: Pigu w 08 Styczeń 2009, 13:34
do klasyfikacji w projekcie miesiąca są brane punkty uzyskane przez członków teamu tylko podczas tego miesiąca
dzieki za szybka odpowiedz
to co piszesz zrozumiale jest
tak tez ze za styczen przydzielono mi juz punkty widze je na swoim koncie jednakze na stronach B@PL ich nie ma i wlasnie o te punkty mi chodzi
czemu nie wyswietlaja sie tam

taka ciekawosc ;)

pozdrawiam

Pigu

#3
a ja Cię widzę http://www.boincatpoland.org/smf/projekt-miesiaca/projekt-miesiaca-wyniki/ poz.268 :) tabela jest chyba aktualizowana co pół godziny

skowron

#4
Cytat: Pigu w 08 Styczeń 2009, 17:02
a ja Cię widzę http://www.boincatpoland.org/smf/projekt-miesiaca/projekt-miesiaca-wyniki/ poz.268 :) tabela jest chyba aktualizowana co pół godziny

heh moj blad przepraszam
generalnie ucięło mi stronę i widziałem tylko znak minus "-" bez kolumny z pkt
powinienem więcej spać ;)


RAD-Poland

tabelka jest aktualizowana ok 15min po ukazaniu się aktualizacji na stronie projektu
w przypadku projektu Rossera@home aktualizacja jest co 6h (o ile nie mają problemów z serwerem)

   
WCG:
PG:         YOYO:

     

TJM

Hm a tak z ciekawości zapytam, jak sprawdzasz stopień świeżości tabel na serwerze ? Korzystając z tego malutkiego pliczku z timestampami ?

W razie jakiejś pilniejszej sprawy - jestem często dostępny na kanale IRC B@P, na forum czasami zapominam zajrzeć lub nie mam czasu.

RAD-Poland

#7
bot sprawdza co 15min zmianę strony http://boinc.bakerlab.org/rosetta/stats/

CytatKorzystając z tego malutkiego pliczku z timestampami ?
nie

przejrzałem z ciekawości znajdujące się tam dwa małe pliczki, w jednym faktycznie jest dana o aktualizacji
<update_time>1231418923</update_time>
i można by z tej danej korzystać ->
CytatGMT: Thu, 08 Jan 2009 12:48:43 GMT
Your timezone: czw, 8 sty 2009, 13:48:43

do określenia czasu "Ostatnia aktualizacja ..." wykorzystuję funkcję filemtime('user.gz');
Cytat(PHP 4, PHP 5) filemtime — Pobiera czas ostatniej modyfikacji pliku
Cytat
filemtime('user.gz'); -> 1231418429
GMT: Thu, 08 Jan 2009 12:40:29 GMT
Your timezone: czw, 8 sty 2009, 13:40:29

EDIT: pewnie można inaczej  ;)

   
WCG:
PG:         YOYO:

     

TJM

Czyli robisz tak samo jak zapewne większość sajtów ze statsami, zauważyłem że z jakiegoś powodu nieliczne tylko pobierają najpierw ten plik z timestampem i zastanawiam się czemu. Może dlatego, żeby czasami nie wstrzelić się w moment kiedy jeszcze nie wszystkie pliki są uaktualnione ?

W razie jakiejś pilniejszej sprawy - jestem często dostępny na kanale IRC B@P, na forum czasami zapominam zajrzeć lub nie mam czasu.

buninek

Zaciekawiony przetwarzaniem tych statystyk, poszukiwałem wydajnego narzędzia do ich obróbki. PHP nie znam ale raczej demonem szybkości nie jest.

Znalazłem coś takiego jak XMLStarlet.
http://xmlstar.sourceforge.net/
Działa pod systemami unix.

W bardzo prosty sposób można wyeksportować tabelę do formatu txt lub przetwarzać bezpośrednio.

xml sel -T -t -m /users/user -v "concat(teamid,'|',name,'|',total_credit,'|',expavg_credit,...)" -n user.xml

wybik otrzymujemy w takiej postaci

46|Name2|32.056639|3.137249|...
...
25|Name1|532.125637|324.386416|...

Przetworzenie pliku o rozmiarze 7MB zajmuje ok 0.5s. Zaimportowanie do sqlite, mysql, postgresql, to już nie problem. Praktycznie wszystkie zapytania można generować bezpośrednio, włacznie z operacjami typu count, avg i sortowaniem.

Na przykład dla danych z PrimeGrid:
można bezpośrednio zawęzić wynik teamid=2 (BOINC@Poland) i sortując po total_credit.

xml sel -T -t -m "/users/user[teamid='2']" -s D:N:- "total_credit" -v "concat(name,'|',total_credit)" -n user.xml

ksysju|2322502.398669
mindc|1829019.789206
gobos|1506539.229029
Sebastian Gruza|640668.012213
Chew-Z|619787.750933
stachu @ fiddex|366273.274244
kai|363554.780606

Identycznie można bawić się z tabelą host.xml, szybko sprawdzić jakie CPU liczą, itp., itd.


RAD-Poland

#10
nowe narzędzie można trochę potestować, próbka 7MB to trochę mało sprawdź np na SETI'm (z tym projektem miałem problemy) http://setiathome.berkeley.edu/stats/ np: user.gz

jaki czas oraz jakie jest szczytowe użycie RAM ?

ja generuję statystyki przy pomocy php

- gzread //rozpakowanie + wczytanie całej bazy do pamięci
- simplexml_load_string //parsowanie ww danych xml (funkcja ma duże zużycie RAM przy projektach seti/wcg baza wejściowa musi przechodzić wstępne czyszczenie dlatego pytanie o zużycie RAM'u)

Kod (php) [Zaznacz]

$file_binary=gzread($fp,$max_lenght_file);
gzclose($fp);
$xml2 = simplexml_load_string($file_binary);


- generowanie statystyki pętla foreach
foreach ($xml2->user as $val2)
if ($val2->teamid==$team_id)
...
$rank['name'][++$i]="$val2->name";
$rank['credit'][$i]="$val2->total_credit";
...


- wyniki
arsort($rank['credit']);
foreach ($rank['credit'] as $key_pozycja => $val)
printf ...


moja znajomość php jest znikoma, ale pamiętam trochę C i jakoś idzie,
optymalizacji "zero" ale te kilkanascie/kilkadzesiąt sekund co kilka godzin nie powoduje dużego spadku RAC ;)

   
WCG:
PG:         YOYO:

     

buninek

Cytat: RAD-Poland w 07 Kwiecień 2009, 17:21
[...]
optymalizacji "zero" ale te kilkanascie/kilkadzesiąt sekund co kilka godzin nie powoduje dużego spadku RAC ;)
Właśnie między innymi dlatego o tym wspominam. Ponieważ odwalasz kawał świetnej roboty. :parrrty:,
a twoja flota komputerów nie jest zbyt duża.

Co do większych plików, każdy możesz podzielić 'split' nawet na 100kB. Jakiś konkretnych testów nie robiłem, ale
wydajność jest bardzo dobra a zużycie pamięci raczej małe.
Wczoraj zaprzęgłem do tego xawk (awk) i przeraziłem się. Wydajność była tragiczna.

buninek

Brak możliwości edycji w tym wątku?

Sprawdziłem na pliku 'user.xml' o rozmiarze 6774kB.
Czas przetworzenia to 0.6s. Zużycie pamięci ok 93MB.

RAD-Poland

#13
CytatBrak możliwości edycji w tym wątku?
należy on do grupy "projekt miesiąca" tym samym podlega takim samym ograniczeniom

CytatSprawdziłem na pliku 'user.xml' o rozmiarze 6774kB.
Czas przetworzenia to 0.6s. Zużycie pamięci ok 93MB

:o
nie dotyczy czasu, ale to zużycie RAM'u (liczyłem na mniej)
przy pliku seti, aż strach pomyśleć (plik wejściowy ok 285MB) bez dzielenia (lub czyszczenia) pliku by się nie obyło

czasy w php są akceptowalne, przy dużej bazie SETI bez limitu RAM'u cała generacja statystyk zamyka się poniżej 20sek
- wywołanie ok 1300 (users_B@P) razy niezoptymalizowanej pętli po pełnej bazie 9kk (all_users) , ale żąda ok 2,4GB RAMu = baza user_poczatkowa i aktualna 2x900MB + wyniki + bufor_php (po czyszczeniu baz schodziłem do 150MB RAMu, ale sporo czasu szło na czyszczenie bazy)

albo robimy coś szybko kosztem RAM'u albo wolniej i oszczędniej  :)

   
WCG:
PG:         YOYO:

     

buninek

Nie spodziewałem się, iż staty z SETI mają takie rozmiary. :o
Z ciekawości pobrałem tylko user.gz (61MB), host.gz (346MB) darowałem sobie. :D

Przefiltrowałem to za pomocą grepa. Zużycie pamięci praktycznie pomijalne.
time zcat user.gz | grep -v -E "^ <url>|^ <has_profile" | grep -B 9 -A 1 "^ <teamid>30228</teamid>" | grep -v "^--" >> boinc@poland.xml

real    0m17.575s
user   0m16.425s
sys    0m0.710s

RAD-Poland

i to jest to czego mi brakowało - @buninek wielkie dzięki :parrrty:

rewelacja - "czyszczenie" spakowanej bazy SETI w locie (2.39user 0.36system 0:22.53elapsed 12%CPU - time trochę dziwnie to wypisał ??, wg top ok 22sek)

wcześniej musiałem rozpakowywać całą bazę, wiedziałem że tak można gdyż mc - Midnight Commander tak robi, ale nie wiedziałem jak się do tego zabrać

czas podszkolić się ze składni komend z konsoli, w kilku miejscach na forum widziałem jej wykorzystanie, nie ukrywam, że próbowałem i byłem zadowolony z wyników  :) :book:

   
WCG:
PG:         YOYO:

     

buninek

Jeszcz troszkę podrążę temat. Proponuję pobrać i skompilować cgrep-a.
http://freshmeat.net/urls/9f47fe2c38aad6f1d9ad93bdc56e5720

Ma dużo większe możliwości, a pod względem szybkości przetwarzania może być nawet do 30x szybszy.
time zcat user.gz | cgrep -v -E "^ <url>|^ <has_profile" | cgrep -9 +1 -D "^ <teamid>2</teamid>" >> boinc@poland.xml
real    0m3.587s
Jak widać różnica jest kolosalna.

Tu jest ciekawe porównanie szybkości przetwarzania.
http://www.pixelbeat.org/programming/readline/

W tym konkretnym przypadku grep spełnia swoje zadanie. Jak sobie poradzić jeśli znaczniki
mają nierówną ilość linii i muszą być wszystkie zachowane? Szukując rozwiązania trafiłem
na pythonowy spliter, który lekko zmodyfikowałem.
W tym wypadku szatkuje co 50000 "rekordów" pomiędzy znacznikami <user>,</user>.
Działa dość żwawo.

#!/usr/bin/env python
import os, os.path

fname = "user.xml"

total_counter = cur_counter = 0
o = None
outf_counter = 0
outdir = 'tmp/'

for line in open(fname):
    if line.startswith("<?xml"):
            continue

    if o is None or cur_counter == 50000:
            cur_counter = 0
            outf_counter += 1
            outfname = 'user.%d.xml' % outf_counter
            outfname = os.path.join(outdir, outfname)
            print outfname

            if o:
                o.write('</users>\n')
                o.close()
            o = open(outfname, 'wb')
            if outf_counter == 1:
                o.write('<?xml version="1.0" encoding="utf-8"?>\n')
            else:
                o.write('<?xml version="1.0" encoding="utf-8"?>\n<users>\n')

    if line == '</user>\n':
                cur_counter += 1
                total_counter += 1

    o.write(line)

if o:
    o.close()

print total_counter


Może być bardzo przydatny jeśli mamy do przetworzenia naprawdę bardzo duże pliki.
Na przykład zechcemy mieć wikipedię offline i przeszukiwać ją w bardzo zaawansowany sposób.
Wersja angielska 'pages-meta-current.xml.bz2' 8.6 GB, polska przy niej to mikrus
'pages-meta-current.xml.bz2' 635.3 MB.

http://en.wikipedia.org/wiki/Wikipedia_database

buninek

Poprzednie wywołanie cgrepa było nieoptymalne. Dopiero czytając mana dopatrzyłem się dużo lepszej możliwości wywołania.

time zcat user.gz | cgrep -D -w '<user>' +w '<\/user>' '^ <teamid>30228</teamid>' >> boinc_poland.txt

real    0m2.580s

Stosując gzipa w wersji wielordzeniowej można jeszcze troszkę uszczknąć. :D
time pigz -cd -p 2 user.gz | cgrep -D -w '<user>' +w '<\/user>' '^ <teamid>30228</teamid>' >> boinc_poland.txt

real    0m1.892s