Autor Zpráva
blizzboz
Profil
mám vlastný CMS postavený na Nette frameworku ktorý je založený na moduloch každý modul je potomkom triedy Module alebo ModuleContainer trieda ModuleContainer môže obsahovať ďalšie moduly alebo ďalšie kontainery modulov. ModuleContainer obsahuje triedu ArrayList do ktorej sa ukladajú moduly ktoré trieda obsahuje, detský modul obsahuje vlastnosť parent ktorá zas obsahuje ID rodičovského modulu. Potom mám ešte triedu Modules ktorá sa stará o vykreslovanie modulov do šablóny. Všetko funguje perfektne pokým moduly pridávam ručne. Pokiaľ ale dáta načítam z databázy celý proces sa asi 10 násovne spomalí pretože dáta musím vytriediť a poukladať podľa id a parentid u a tento proces sa cyklicky opakuje až kým nevytvorím všetky moduly pomáham si cyklami a rekurzívnou funkciou. obávam sa že pri niekoľkých 10kach modulov bude proces načítavania veľmi pomalý a taktiež že záťaž na server bude dosť veľká. preto hľadám efektívny algoritmus na zoradenie dát z databázy a zoradenie modulov podľa id a parentid neviete o niečom takom?

Moderátor nightfish: Tvůj projev je špatně srozumitelný, čleň text do odstavců.
blizzboz
Profil
nightfish: špatně srozumitelný? v podstate mi išlo o stromové zoradenie modulov, no ako vidím zase si budem musieť pomôcť sám už som tento problém tuším pár rokov dozadu riešil pri vnorených komentároch tak to idem očekovať...
fajzen
Profil
blizzboz:
nightfish ti asi chcel naznačiť, že ucelený blok textu s minimálnym označovaním koncov viet sa ťažko číta... Skús si predstaviť, že si niekto iný, že nevieš, o čom je reč a prečítaj si to...
Ale k tvojmu problému - Neviem si dosť dobre predstaviť výslednú štruktúru. Mohol by si sem dať to tvoje riešenie, mohli by sme prísť na nejaký spôsob optimalizácie (alebo si aspoň lepšie predstavím o čo ide)
Jediné, čo by som ti vedel takto poradiť, je cachovať už zoradené moduly
blizzboz
Profil
fajzen: už som to vyriešil spravil som si triedu ktorá zoradí pole výsledkov do multirozmerného pola proste vytvorí strom. nwm aká je pri tom záťaž na výkon ale to triedenie je celkom rýchle, robil som aj testy a zoradenie 1000 výsledkov trvá 500 ms na bežnej stránke bude max 100 modulov takže 50 milisekúnd ma nezabije, dĺžka triedenia sa zvyšuje s pribúdajúcim počtom výsledkov na druhú.

class Tree extends Object
{
	static protected function sort($sourceArray, &$destTree, $parentId = -1)
	{
		for ($i = 0, $count = count($sourceArray); $i < $count; $i++)
		{
			$item = $sourceArray[$i];
			if ($item['parent'] == $parentId)
			{
				self::sort($sourceArray, $item, $item['id'], $i);
				$destTree['contains'][] = $item;
			}
		}
	}
	
	static public function build($array)
	{
		self::sort($array, $tree);
		return $tree;
	}
	
	static public function buildFromDibiResult(DibiResult $dibiResult)
	{
		foreach ($dibiResult as $row) $array[] = $row;
		return self::build($array);
	}
}


no a potom toto multirozmerné pole prejdem a kontainerom(potomkom triedy Module > ContainerModule) priradím elementy ktoré im patria(vačšinu metód triedy Modules som vynechal):

class Modules extends Object
{
...	
	protected function proceed($tree)
	{
		
		if (isSet($tree['contains']))
		{
			$contains = $tree['contains'];
			foreach ($contains as $module)
			{				
				$module['object'] = new $module['class'];			
				if (isSet($tree['object'])) $tree['object']->add($module['object']);
				if ($module['parent'] == -1) $this->modules->add($module['dest'], $module['object']);
				$this->proceed($module);
			}
		}
	}
	
	public function addModules(DibiResult $dibiResult)
	{
		$this->proceed(Tree::buildFromDibiResult($dibiResult));
	}
...
}
blizzboz
Profil
fajzen:
Jediné, čo by som ti vedel takto poradiť, je cachovať už zoradené moduly

s tým cachovaním to už aj mňa napadlo, Nette vraj podporuje cachovanie tak to testnem

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0