k47.cz
výběr foto Praha povídky kultura
TECH ▞▞ kolo | twitter RSS
««« »»»

Data positive

15. 6. 2009 (před 10 lety) — k47 (CC by-nc-sa) (♪)

Data přá­telé, data. Na ničem jiném ne­zá­leží. Pro­gra­mo­vání je nuda, ale práce s daty se krá­lov­ská dis­ci­plína. A já si rád hraji s daty. Už dlouho jsem mířil tímto směrem, pra­co­val a hrál si s da­ta­bá­zemi (tedy da­ta­bází – MySQL) a pře­mýš­lel jsem jak něco udělat, jak to udělat, aby to fun­go­valo rychle, jak data získat a co z nich zjis­tit. Ší­len­ství do­sáhlo vr­cholu, když jsem napsal ně­ko­lik skriptů, které stáhly celý obsah strá­nek Sdru­žení ama­tér­ských spi­so­va­telů (20000 li­te­rár­ních děl, 3000 autorů) a dva dny jsem ne­dě­lal nic jiného než ta data zkou­mal ze všech mož­ných úhlů, dělal sta­tis­tiky a zjiš­ťo­val změny cho­vání uži­va­telů (jak hod­notí, jak ko­men­tují, co čtou, o co nemají zájem atd).

Pak jsem se roz­hodl jít do ana­lýzy slov, zjis­tit jakou kdo má slovní zásobu, ty­pické cha­rak­te­ris­tiky pro dané žánry atd. atd. Prostě další pokus něco zjisti i když si nejsem moc jistý, co vlastně hledat a jestli to k něčemu bude. Šel jsem do toho, ale jak jsem po­sléze zjis­til, tohle bádání se stalo hlavně za­těž­ká­vací zkouš­kou vý­kon­nosti da­ta­báze a schop­nosti op­ti­ma­li­zo­vat až na dřeň.

SASPI je server spi­so­va­telů a bás­níků, takže je vám jasné, že po­u­žili hodně slov. Za­tra­ceně hodně. Dalo by se říct, že víc než by bylo nutné. První pří­stup k řešení pro­blému byl jed­no­du­chý: načíst jedno dílo, v php skriptu ho roz­dě­lit na jed­not­livá slova a ty pak uložit do da­ta­báze.

Nápad to byl velice jed­no­du­chý, ale zá­ro­veň velice pomalý, pro­tože jsem da­ta­bázi do­slova za­sy­pá­val ti­sí­cov­kami dotazů. Použil jsem tedy pre­pa­red sta­te­ments, které byly o něco rych­lejší (sice neumí vy­u­ží­vat query cahce, ale to v pří­padě in­sertů nevadí), ale pořád to trvalo věč­nost. Všechny texty do­hro­mady mají 85 mega, což může zna­me­nat 10 mi­li­onů slov tedy 10 mi­li­onů in­sertů za které vám vaše da­ta­báze po­dě­kuje.

Pak mě na­padlo změnit stra­te­gii sběru dat, aby šly použít hro­madné in­serty s tím, že do da­ta­báze naperu všechna slova horem dolem a pak je nějak pro­tří­dím, až budou v da­ta­bázi. To bylo o něco ry­h­lejší, pro­tože DBMS ne­za­sy­pá­vám tolika malými dotazy, ale ně­ko­lika mon­stróz­ními.

Pořád to bylo pomalé.

Hlavní pro­blém tkvěl ve faktu, že jsem nejdřív načetl daný text, poslal ho kli­ent­skému skriptu, který ho nějak zpra­co­val (roz­se­kal na slova), pak z něj vy­tvo­řil SQL pří­kazy, které po­sí­lal zpátky da­ta­bázi nebo použil bi­nární pro­to­kol pre­pa­red sta­te­ments.

Nedalo se svítit, celá logika musela opus­tit php skript a vlézt do da­ta­báze. Napsal jsem ulo­že­nou pro­ceduru, která pomocí kur­zorů na­čí­tala data a pak je zpra­co­vá­vala (pomocí dal­ších pro­cedur) a uklá­dala. Všechno na straně da­ta­báze.

A to už je na­dějné a ro­zumně rychlé.

Odhad trvání úlohy s ulo­že­nou pro­cedu­rou: méně než 1 hodina. Pravda, ne­vy­padá to nijak vesele, ale před­chozí verze řešení trvaly hodně přes dvě hodiny.

A pointa? Op­ti­ma­li­zace je někdy po­třeba jako sůl. Je po­třeba vědět jak na to. Někdy je po­třeba změnit celou stra­te­gii sběru a zpra­co­vání dat, aby to fun­go­valo svižně. Já to všechno umím. V da­ta­bá­zích se hrabu rád. Začal jsem sle­do­vat záznam kurzu Sta­tis­ti­cal Aspects of Data Mining, které před­náší chlá­pek ze Stan­ford­ské uni­ver­zity. A tak dále a tak dále.

píše k47 & hosté, ascii@k47.cz