Nette Utils: generátory výkonu a efektivity
Nette Framework přináší výkonnostní výhody a optimalizaci práce s pamětí využitím tzv. generátorů. Tyto novinky vám umožní pracovat s velkými datovými sadami elegantněji a efektivněji, aniž byste museli měnit způsob, jakým píšete svůj kód. Pojďme se podívat na tři oblasti, kde Nette využívá sílu generátorů způsobem, který možná překvapí i zkušené vývojáře.
Čtení souborů po
řádcích s FileSystem::readLines()
Práce s velkými soubory byla vždy výzvou, zejména pokud jde
o paměťovou náročnost. Nette přichází s elegantním řešením
v podobě metody FileSystem::readLines()
.
use Nette\Utils\FileSystem;
$lines = FileSystem::readLines('large_file.txt');
foreach ($lines as $number => $line) {
echo "Řádek $number: $line\n";
// Zpracování řádku...
}
Na první pohled se může zdát, že tento kód dělá totéž co nativní
funkce PHP file()
. Ale zdání klame. Zatímco file()
načte celý soubor do paměti najednou, což může být problematické
u velkých souborů, readLines()
využívá generátor
k postupnému čtení souboru.
Klíčové výhody:
- Nízká paměťová náročnost: Soubor se čte průběžně, v paměti je vždy jen jeden řádek.
- Okamžité zpracování: Nemusíte čekat na načtení celého souboru.
- Práce s libovolně velkými soubory: Velikost souboru není omezena dostupnou pamětí.
- Přirozené rozhraní: Z pohledu programátora se kód píše stejně snadno.
Toto řešení je ideální pro zpracování logů, velkých datových exportů nebo jakýchkoliv rozsáhlých textových souborů.
Lazy regulární výrazy
se Strings::matchAll()
Metoda Strings::matchAll()
dostala v nové verzi Nette Utils
4.0.5 zajímavý upgrade. Nový parametr $lazy
umožňuje
postupné zpracování řetězce při hledání shod s regulárním
výrazem.
use Nette\Utils\Strings;
$text = file_get_contents('very_long_text.txt');
$pattern = '/\b\w{5,}\b/'; // slova s 5 a více znaky
$matches = Strings::matchAll($text, $pattern, lazy: true);
foreach ($matches as $match) {
echo "Nalezeno slovo: {$match[0]}\n";
// Můžeme kdykoliv přerušit zpracování
if ($match[0] === 'konec') {
break;
}
}
Bez parametru lazy
by se rovnou prohledal celý text a všechny
shody by se uložily do paměti. S lazy: true
se text prochází
postupně a shody se hledají za běhu.
Výhody:
- Rozložení výkonu: Zpracování probíhá průběžně, ne v jednom velkém bloku.
- Možnost předčasného ukončení: Můžete přestat hledat, jakmile najdete, co potřebujete.
- Přirozené rozhraní: Z pohledu programátora se kód píše stále stejně
Toto je zvláště užitečné při analýze velkých textů, parsování logů nebo při hledání specifických vzorů v rozsáhlých datech.
Efektivní práce pomocí třídy Iterables
Nová třída Iterables přináší sadu
metod pro práci s iterovatelnými strukturami, jde o obdobu toho, co nabízí
Arrays
pro pole. Navíc však má metody, které jsou
optimalizovány pro postupné zpracování. Pojďme si ukázat, jak je můžete
využít ve vašem kódu.
use Nette\Utils\Iterables;
$numbers = // velké množství dat
// filtrování prvků
$evenNumbers = Iterables::filter($numbers, fn($n) => $n % 2 === 0);
// transformace prvků
$squared = Iterables::map($numbers, fn($n) => $n * $n);
// transformace klíčů i hodnot
$squaredKeys = Iterables::mapWithKeys($fruits, fn($v, $k) => [$k * $k, $n]);
Klíčovou výhodou je líné vyhodnocování, kdy transformace se provádí až v momentě, kdy je prvek skutečně potřeba. Můžete kdykoliv ukončit iteraci a ušetřit tak výpočetní čas:
foreach ($evenNumbers as $number) {
if ($number > 20) break; // Můžeme kdykoliv ukončit
}
Tyto metody jsou zvláště užitečné při práci s velkými kolekcemi dat, jako jsou rozsáhlé databázové výsledky nebo při zpracování streamů dat. Navíc jsou zcela transparentní a můžete je začít používat okamžitě, aniž byste museli zásadně měnit strukturu vašeho kódu. Nette se snaží přinášet pokročilé funkce způsobem, který je přístupný a snadno použitelný pro vývojáře všech úrovní.
Komentáře
Tleskám, samé super věci 🙂
Těším se, až se dostaneš na fibers
Super nápad. FileSystem::readLines i Strings::matchAll se budou určitě hodit.
Super, díky Davide
+1
Chcete-li odeslat komentář, přihlaste se