Re: [python] hash objektu, kontrola aktuálnosti dat v databázi
On 20.6.2011 16:33, Jirka Vejrazka wrote: Proč řeším cache? No proč ne? Proč bych se měl pokaždé při požadavku na meničko ptát databáze, když to jednoduše šoupnu do memcache a data se naservírují od tam. To považuju za správný postup i kdyby to mělo používat jenom 10 lidí. Treba proto, ze ta databaze ma pochopitelne taky cache a je to bez prace? Pri 10 uzivatelich budes mit vic prace s udrzovanim cache nez za kolik to stoji. Ale jak jsem uz napsal, je to tvoje hracka ;-) Jirka Martine, ver Jirkovi. Kdyz budes optimalizovat az ve chvili, kdy to skutecne budes potrebovat, usetris si boleni hlavy a nam cas. :) Pises, ze to chces udelat spravne. Podle meho spravne znamena jak nejjednoduseji to jde. A kesovani je vzdycky komplikace. Tu evidentne zatim nepotrebujes. A vsichni vime, ze Python je na agilni zpusob vyvoje jako stvoreny. -- : Vladimir Macek : http://macek.sandbox.cz : +420 608 978 164 : UNIX Dev || Training : Python, Django : GPG key 1F059424 ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] hash objektu, kontrola aktuálnosti dat v databázi
Interní hash(x) jen volá metodu příslušného objektu x.__hash__() a jednou z jejích priorit je nalezení místa v dict(). Ale v dict() se s konflikty musí celkem počítat, takže kvůli rychlosti nebude moc spolehlivá. Přidávám se k Jirkovi Vejražkovi a k jeho doporučení standardního modulu hashlib. Problém je ale jinde. Hash (kvalitní varianta) je jen velké číslo, které mi pomůže odhalit, že je něco stejné. Pokud ale buduji databázi ze stránek obsahujících jídelníček, pak mi jednotlivých záznamů není celkem k ničemu. Stejně musím zjistit datum, restauraci... Netvoříš přece databázi, ve které je hash klíčem. Potřebuješ hledat podle více klíčů. Hash celé stránky nebo její významné části by mohl pomoci odhalit, jestli se stránka změnila (pokud to nejde zjistit rozumnějším způsobem). Pokud tam změna není, nemusím dělat nic. Pokud tam změna je, musím stejně rozlézt všechny záznamy a porovnat je s databází podle klíčů. Pokud budu mít nový potenciální objekt databáze (obalený záznam), který má stejný hash jako existující objekt databáze, nedělám nic. Pokud má jiný hash, musím ho stejně vložit. Proč bych měl pracně zjišťovat, jestli tam takový objekt zatím není a teprve pak ho vkládat? Jednodušší je ho tam prostě vložit (nahradit případně už existující). Nebo mi nějaká část myšlenky utekla? Mrkni na možnost zjistit položku HTTP hlavičky Last-Modified http://diveintopython3.py.cz/http-web-services.html#last-modified Petr __ Od: martin...@...il.com Stačilo se na to trochu vyspat a už asi vím, jak to provedu. Ale i tak, budu opravdu vděčný za každou připomínku. Aby byl jasný kontext, jedná se o parsování obědových meniček z různých restaurací, sbírám tyhle data, abych k nim pak měl přístup z aplikace na Androidu. Každé jedno jídlo je uloženo v databázi ve vlastním záznamu, je u něj odkaz na restauraci ke které patří, pro jaký den, cena, případně gramáž, atd. Z těchto jednotlivých dat můžu jednoduše udělat jeden string a z něho udělat hash a poznačit rovnou do záznamu toho konkrétního jídla. Když příjde kontrola dat, znovu se každé jídlo zparsuje, vyrobí se objekt databázového modelu a když je hotovo, tak si k nim vytáhnu už existující data z databáze a porovnám hashe, ty které se změnili nechám být, změněné updatuju, ty co jsou tam navíc vymažu. Nic lepšího mě nenapadlo :) ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] hash objektu, kontrola aktuálnosti dat v databázi
Pokud budu mít nový potenciální objekt databáze (obalený záznam), který má stejný hash jako existující objekt databáze, nedělám nic. Pokud má jiný hash, musím ho stejně vložit. Proč bych měl pracně zjišťovat, jestli tam takový objekt zatím není a teprve pak ho vkládat? Jednodušší je ho tam prostě vložit (nahradit případně už existující). Nebo mi nějaká část myšlenky utekla? Naco ale dookola prepisovat uz existujuce zaznamy ? Nemyslim si, ze jedalne listky sa menia nejako extra casto, skor sa raz vytvoria a mozno raz za pol roka sa v nich nieco upravi. Mimochodom, vytvaranie hashov by som zrejme naviazal ako trigger pri insert/update: http://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html#function_md5 Mrkni na možnost zjistit položku HTTP hlavičky Last-Modified http://diveintopython3.py.cz/http-web-services.html#last-modified Petr __ Od: martin...@...il.com Stačilo se na to trochu vyspat a už asi vím, jak to provedu. Ale i tak, budu opravdu vděčný za každou připomínku. Aby byl jasný kontext, jedná se o parsování obědových meniček z různých restaurací, sbírám tyhle data, abych k nim pak měl přístup z aplikace na Androidu. Každé jedno jídlo je uloženo v databázi ve vlastním záznamu, je u něj odkaz na restauraci ke které patří, pro jaký den, cena, případně gramáž, atd. Z těchto jednotlivých dat můžu jednoduše udělat jeden string a z něho udělat hash a poznačit rovnou do záznamu toho konkrétního jídla. Když příjde kontrola dat, znovu se každé jídlo zparsuje, vyrobí se objekt databázového modelu a když je hotovo, tak si k nim vytáhnu už existující data z databáze a porovnám hashe, ty které se změnili nechám být, změněné updatuju, ty co jsou tam navíc vymažu. Nic lepšího mě nenapadlo :) ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] hash objektu, kontrola aktuálnosti dat v databázi
Ono hodne zalezi na tom, co Martin myslel tim parsuju ruzny obsah z webu. Pokud by to znamenalo stahovani jidelnich listku z nejakeho seznamu URL, tak by stalo za zamysleni pouzit standardnich mechanizmu HTTP, konkretne hlavicky If-modified-since. Pak by stacilo zjistit, jestli server pro danou stranku vraci 304 (stranka nezmenena) nebo 200 (novy obsah). Ale tohle opravdu zavisi na tom, co je na druhe strane. Jirka ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] hash objektu, kontrola aktuálnosti dat v databázi
Ahoj, díky za moc zajímavé myšlenky. K tomu co parsuju, jde o jídelníčky denní menu různých restaurací. Každá restaurace publikuje denní obědové menu jinak, někteří v neděli/pondělí vyvěsí kompletní menu pro celý týden, někteří jen pro následující den, je to různé. Ať už to dělá každý jinak, vždycky můžou menu pro následující/kterýkoli den změnit, což je pro mě problém, pokud jsem si k sobě už uložil starou verzi, proto chci peridicky kontrolovat jaký je stav. Pro každou restauraci mám samostatný modul, kde je link na jídelníček a metoda která umí z html vytahat data, která mě zajímají ( a další obslužné metody). Každé jídlo se uloží do objektu databázového modelu (je to celé postavené na djangu) a zatím mám zapracovanou myšlenku hashe, tedy onen objekt má popis jídla, cenu, gramáž, atd. Z tohoto se vytvoří hash který se tam taky uloží. Při dalším checku se opět zparsuje, opět se nasekají objekty a spočítají hashe, ale jestli se bude ten jeden aktuální objekt updatovat nebo ne závisí na tom, jestli se hash změnil nebo ne. Pokud je popis jídla, cena, nebo cokoli jiné, bude i hash jiný a objekt se přepíše. Na HTTP hlavičky jsem nepomyslel a je to dobrý nápad, díky za to, vyzkouším, rozhodně se mi to líbí. Chci do databáze zapisovat co nejmíň, celé to běží na Google App engine, jsou tam různé kvóty na čtení/zápis z databáze a i když nečekám nějaký obrovský provoz, chci to napsat slušně :) -- S pozdravem Martin Stiborský Jabber: st...@njs.netlab.cz ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] hash objektu, kontrola aktuálnosti dat v databázi
Jo, pravda je, že když už ty data mám zparsované a nachystané, tak by bylo nejjednodušší je i zapsat. Nemám vůbec odhad jak to bude náročné na procesorový čas, každopádně, když se mi každé dvě hodiny (nebo jakýkoli jiný nastavený interval) přepíše vlastně komplet celá databáze, budu muset promazat i cache, to bude taky něco stát... 2011/6/20 Jirka Vejrazka jirka.vejra...@gmail.com: Ja sice chapu, ze chces vyrobit slusnou aplikaci, ale pokud tech jidelnicku budou desitky az stovky, tak bych nejakou optimarlizaci zapisovani do databaze vubec neresil. Rekl bych, ze zjisteni jestli ten zapis usetrit nebo ne bude drazsi nez zapis sam. Jirka Premature optimization is the root of all evil :) ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python -- S pozdravem Martin Stiborský Jabber: st...@njs.netlab.cz ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] hash objektu, kontrola aktuálnosti dat v databázi
Nemám vůbec odhad jak to bude náročné na procesorový čas, každopádně, když se mi každé dvě hodiny (nebo jakýkoli jiný nastavený interval) přepíše vlastně komplet celá databáze, budu muset promazat i cache, to bude taky něco stát... Update kazde dve hodiny? To ridis raketovy provoz? ;-) Ale vazne - netusim, jak a pro koho tu aplikaci pises, ale kdyby mi nekdo stahoval jidelni listek kazde dve hodiny, tak zacnu premyslet nad blokovanim daneho stroje. Jednou za den bych to pochopil. Pokud resis optimalizaci, tak pri takovehle frekvenci stahovani nebude problem zapis do databaze, ale prenesena data. Jirka ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] hash objektu, kontrola aktuálnosti dat v databázi
Ale vazne - netusim, jak a pro koho tu aplikaci pises, ale kdyby mi nekdo stahoval jidelni listek kazde dve hodiny, tak zacnu premyslet nad blokovanim daneho stroje. Jednou za den bych to pochopil. Pokud resis optimalizaci, tak pri takovehle frekvenci stahovani nebude problem zapis do databaze, ale prenesena data. 12 pristupov na web za den za ti zda vela ? A traffic urcite nebude problem, ved to bude maximalne par MB denne. Jirka ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] hash objektu, kontrola aktuálnosti dat v databázi
Proč řeším cache? No proč ne? Proč bych se měl pokaždé při požadavku na meničko ptát databáze, když to jednoduše šoupnu do memcache a data se naservírují od tam. To považuju za správný postup i kdyby to mělo používat jenom 10 lidí. Treba proto, ze ta databaze ma pochopitelne taky cache a je to bez prace? Pri 10 uzivatelich budes mit vic prace s udrzovanim cache nez za kolik to stoji. Ale jak jsem uz napsal, je to tvoje hracka ;-) Jirka ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] hash objektu, kontrola aktuálnosti dat v databázi
Stačilo se na to trochu vyspat a už asi vím, jak to provedu. Ale i tak, budu opravdu vděčný za každou připomínku. Aby byl jasný kontext, jedná se o parsování obědových meniček z různých restaurací, sbírám tyhle data, abych k nim pak měl přístup z aplikace na Androidu. Každé jedno jídlo je uloženo v databázi ve vlastním záznamu, je u něj odkaz na restauraci ke které patří, pro jaký den, cena, případně gramáž, atd. Z těchto jednotlivých dat můžu jednoduše udělat jeden string a z něho udělat hash a poznačit rovnou do záznamu toho konkrétního jídla. Když příjde kontrola dat, znovu se každé jídlo zparsuje, vyrobí se objekt databázového modelu a když je hotovo, tak si k nim vytáhnu už existující data z databáze a porovnám hashe, ty které se změnili nechám být, změněné updatuju, ty co jsou tam navíc vymažu. Nic lepšího mě nenapadlo :) ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] hash objektu, kontrola aktuálnosti dat v databázi
Myslim, ze na dane ucely je uplne jedno, aku hashovaciu funkciu pouzije. Skor by som odporucal co najjednoduchsiu (tzn. najnenarocnejsiu), ved prinajhorsom sa stane, ze sa updatuje nieco, co sa updatovat nemuselo. azur __ Od: Jirka Vejrazka jirka.vejra...@gmail.com Komu: Konference PyCZ python@py.cz Dátum: 19.06.2011 12:11 Predmet: Re: [python]hash objektu, kontrola aktuálnosti dat v databázi Ahoj, interni funkce hash() moc vhodna neni, mrkni se na funkce sha1() nebo md5() z modulu hashlib. Jirka ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] hash objektu, kontrola aktuálnosti dat v databázi
Naopak, muze se stat, ze se neupdatuje neco, co by se updatovat melo, pokud budou mit dvoje ruzna data stejny hash. Tomu se kryptograficke hashe snazi predejit, ale neni to cilem jednoduchych hashovacich funkci. Obecne se doporucuje po kontrole hashe jeste zkontrolovat, jestli jsou data opravdu stejna - porovnani hashe nam tedy rekne bud to, ze retezece urcite nejsou stejne (potom usetrime), nebo to, ze retezce mozna jsou stejne, ale jeste je treba je zkontrolovat. Myslim si, ze v diskutovanem pripade se pouziti hashu nehodi - vzhledem k tomu, ze je k vytvoreni hashe treba vzdy projit vsechna data, bylo by pravdepodobneji vyhodnejsi porovnavat stara a nova data primo bez vytvareni hashu. k21 2011/6/19 azurIt azu...@pobox.sk: Myslim, ze na dane ucely je uplne jedno, aku hashovaciu funkciu pouzije. Skor by som odporucal co najjednoduchsiu (tzn. najnenarocnejsiu), ved prinajhorsom sa stane, ze sa updatuje nieco, co sa updatovat nemuselo. azur __ Od: Jirka Vejrazka jirka.vejra...@gmail.com Komu: Konference PyCZ python@py.cz Dátum: 19.06.2011 12:11 Predmet: Re: [python]hash objektu, kontrola aktuálnosti dat v databázi Ahoj, interni funkce hash() moc vhodna neni, mrkni se na funkce sha1() nebo md5() z modulu hashlib. Jirka ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python