top of page

Proč (zbytečně) používat vlastní funkce

Dnes Vás zkusím přesvědčit nebo alespoň osvětlit racionální aspekty (ne)zbytečně využívat vlastní funkce. Kódu tentokrát moc nebude, takže "odpočinkový" post. Co to znamená? Znamená to jen "divný" přístup, kdy budete kousky svého kódu, představující logické dokončené celky, balit do funkce. Klidně i bez jakýchkoliv parametrů, čili všechno bude hard-coded uvnitř.

Proč to má smysl? Uvedu vlastní příklad.

Pracuji ve společnosti, kde se standardně pro jakoukoliv běžnou roli aktuálně nakupují počítače s 3 GB RAM. Využívaném systémem je Win 7, který sám o sobě, dle mého názoru a zkušeností, není vůči RAM bůhvíjak šetrný. Dále připočítejte nějaký megabyty (spíš pár stovek) na integrovanou grafiku, prohlížeč, interní nahodilé procesy Windows apod. A jaký je výsledek? V "klidovém" režimu jsem počítač nikdy neviděl spotřebovávat méně, než 1,6 GB RAM - to je opravdu vzácné. Většinou spotřebovává něco málo přes 2 GB. Pokud pustíte RStudio, pracujete s velkými datasety (běžně importuji i několik datasetů přesahujících milión řádků) a nedej bože ještě potřebujete nějaký SQL manager (SQL Management Studio, Oracle SQL Designer atd.), tak je v takovém případě skoro jisté "sežraní" veškeré takto skromné RAM.

Důsledek? Kolaps RStudia při výpočetních operacích či nemožnost je provádět, neboť Vás R bude otravovat hláškou cannot allocate vector of size XX Mb.

Co s tím? Uvedu seznam doporučení:

  • Promazávat zbytečné objekty, které v nejbližších desítkách minut / hodinách práce s R nebudete potřebovat (hlavně ty velké, samozřejmě).

  • Nastavit limit paměti blízko maximálně možné hodnotě (ne na max, ze zkušeností právě sežrání v případě potřeby celé RAM omezuje schopnost systému adekvátně reagovat, sekne se)

  • "Vytunit" počítač další RAM - nejlepší způsob ;)

  • Zmenšit rozměr úlohy (jistě, ne vždy možné)

  • Balit mezivýpočty a jiné celky kódu, které vedou jen k vyprodukování jednoho většího celku/objektu pro další použití, do vlastních funkcí.

Odstraňovat objekty můžete, samozřejmě, pomoci příkazu remove():

Zkontrolovat a rozšířit paměťový limit pak takto:

Hm..psal jsem, že mám 3 GB, ale je tam najednou číslo 8103 - divné, že? Ne, post píšu z vlastního počítače a ten má opravdu 8 GB RAM. Tady o problému cannot allocate vector of size zatím nevím ;)

Jak vytvořit vlastní funkci? Podrobně můžete prostudovat zde, ukážeme jen krátký návod:

Proč je toto řešení smysluplné? Protože promazávat je pracné, paměťový limit je limitován velikostí RAM a nepomůže, pokud neplníte bod 1, rozšíření RAM nemusí být vždy dostupná alternativa, měnit rozměr úlohy/datasetu už vůbec ne. Z toho vyplývá, že představený přístup je praktický a přínosný. Důvod je prostý - funkce sice všechny potřebné pro výpočet objekty tvoří a paměť spotřebovává, ale jen po dobu jejího vykonání. Tvoří tzv. lokální proměnné, které ani neuvidíte v Environment browseru, a následně je smaže. Takže Vám nikdy nebudou viset "jednorázové" objekty (občas velmi rozměrné), které budou zcela nesmyslně zabírat prostor a omezovat tak systém v přidělování R další paměti tak potřebné pro jiné operace (odhady modelů, transformace dat, ...). Jistě, je ale lepší aplikovat kombinací uvedených bodů.

Doufám, že i Vám tento přístup usnadní překonání případných nepříjemností s paměťovým limitem a naučí šikovně využívat user-defined functions.


Příspěvky
Hledat dle tagů
Zatím žádné štítky
bottom of page