Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: sortowanie tablicy
Forum PHP.pl > Forum > PHP
1q2w3e4r
  1. $tablica =
  2. (
  3. [http://serwer1.pl] => Array
  4. (
  5. [server] => [url="http://serwer1.pl"]http://serwer1.pl[/url]
  6. [load] => 0.20
  7. [memory_free] => 1893
  8. [memory_usage] => 154
  9. [cpu%_usage] => 2
  10. )
  11.  
  12. [http://serwer2.pl] => Array
  13. (
  14. [server] => [url="http://serwer2.pl"]http://serwer2.pl[/url]
  15. [load] => 0.44
  16. [memory_free] => 1925
  17. [memory_usage] => 122
  18. [cpu%_usage] => 0
  19. )
  20.  
  21. [http://serwer3.pl] => Array
  22. (
  23. [server] => [url="http://serwer3.pl"]http://serwer3.pl[/url]
  24. [load] => 0.00
  25. [memory_free] => 1444
  26. [memory_usage] => 180
  27. [cpu%_usage] => 43
  28. )
  29.  
  30. )


Podaję przykładową tablice, którą chce posortować.
Chodzi o to że musze wybrać serwer, który jest w danej chwili najmniej obciążony i wyświetlić jego dane na ekran.

Najpierw wybieramy serwer, który ma najmniej obciążone wszystkie elementy i który nie przekracza load < 1.50, memory_free < 1700, cpu%_usage < 80
Jeśli jest kilka takich serwerów, które nie przekraczają tych granic wybieramy z nich serwer (klucz tablicy), który ma najmniej obciążony ram (memory_free), a nastepnie load.
Jeśli wszystkie serwery przekroczyły load < 1.50, memory_free < 1700, cpu%_usage < 80 to również sprawdzamy który ma najmniej obciążony ram oraz load i ten serwer wybieramy.

Dodam, że nie wiem ile będzie tych serwerów w danej chwili. Dlatego trzeba liczyć ile ich jest, a nie na sztywno wypisać bo tak to można później zrobić funkcja min();

Zaczynam w php i nie wiem jak to posortować wszystko aby dobrze działało.
darko
Musiałbyś napisać własny komparator (funkcja sortująca) i użyć uasort (przykład w manualu). Poza tym pojawia się pewien niewielki problem, mianowicie mamy 3 kryteria sortowania, musiałbyś najlepiej określić priorytety (i/lub) proporcje ważności każdego kryterium.
r4xz
coś na kształt
$index = 0;

for( tu wiadomo... ) {
if( $array[$i]['load'] < $array[$index]['load'] )
$index = $i;
else if( $array[$i]['memory_usage'] < $array[$index]['memory_usage'] )
$index = $i;
...
}

jeśli głównie kryterium (tu: load) jest takie same to leci po następnym (tu: memory_usage)

--- edit

lub jak wyżej - sortowanie z funkcją (usort)
-jarek-
Sprawa jest banalna .
Moja propozycja to sortowanie przez "wstawianie". poszukaj w google.
Odradzam sortowanie rekurencyjne chyba że tablica będzie nieduży.
darko
~-jarek- problem nie leży w doborze algorytmu sortowania, a w doborze klucza, a właściwie wag dla poszczególnych kryteriów sortowania, a tych jest kilka:
- ogólne obciążenie
- zużycie pamięci
- zużycie procesora

Autorowi wątku doradzam jednak skorzystanie z gotowych mechanizmów load balancingu dla serwerów.
http://content.websitegear.com/article/load_balance.htm
http://www.javaworld.com/javaworld/jw-10-2...alancing-1.html

Właściwie, jaki jest cel tego projektu?
1q2w3e4r
Na aktualny poziom, na którym się znajduje w php to zrobiłem taki skrypt, który wybiera najbardziej obciążony serwer. Wykorzystałem znane mi funkcje.
Byłbym wdzięczny za jakaś lepszą wersje tego.

  1. // testowe tablice
  2. $servers2[] = array('server' => 'http://jakistestowy2.pl', 'load' => '1.66', 'upload' => '60.31', 'download' => '90.50', 'memory_free' => '1300', 'memory_usage' => '700', 'cpu%_usage' => '40');
  3. $servers2[] = array('server' => 'http://jakistestowy.pl', 'load' => '0.44', 'upload' => '20.01', 'download' => '30.00', 'memory_free' => '1700', 'memory_usage' => '300', 'cpu%_usage' => '16');
  4.  
  5. $servers2[] = array('server' => 'http://jakistestowy3.pl', 'load' => '0.78', 'upload' => '100.00', 'download' => '70.65', 'memory_free' => '1000', 'memory_usage' => '1000', 'cpu%_usage' => '60');
  6.  
  7. $servers = $servers2;
  8.  
  9. echo '<b>Przykładowe serwery:</b> <br />';
  10. print_r($servers);
  11.  
  12. echo '<br /><br />';
  13.  
  14. // liczymy ile jest serwerów
  15. $ile_serwerow = count(array_keys($servers));
  16.  
  17. // definiujemy tablice
  18. $tablica_load = array();
  19. $tablica_upload = array();
  20. $tablica_download = array();
  21. $tablica_memory_free = array();
  22. $tablica_memory_usage = array();
  23. $tablica_cpu_usage = array();
  24.  
  25. // tworzymy tablice parametrów
  26. for ($i=0; $i<$ile_serwerow;$i++)
  27. {
  28. $tablica_load[$servers[$i]['server']] = $servers[$i]['load'];
  29. $tablica_upload[$servers[$i]['server']] = $servers[$i]['upload'];
  30. $tablica_download[$servers[$i]['server']] = $servers[$i]['download'];
  31. $tablica_memory_free[$servers[$i]['server']] = $servers[$i]['memory_free'];
  32. $tablica_memory_usage[$servers[$i]['server']] = $servers[$i]['memory_usage'];
  33. $tablica_cpu_usage[$servers[$i]['server']] = $servers[$i]['cpu%_usage'];
  34. }
  35. echo '<b>Wyświetlamy tablice parametrów:</b> <br />';
  36. print_r($tablica_load);
  37. echo '<br />';
  38. print_r($tablica_upload);
  39. echo '<br />';
  40. print_r($tablica_download);
  41. echo '<br />';
  42. print_r($tablica_memory_free);
  43. echo '<br />';
  44. print_r($tablica_memory_usage);
  45. echo '<br />';
  46. print_r($tablica_cpu_usage);
  47. echo '<br /><br /><br /><br />';
  48.  
  49.  
  50. // wybieramy serwery, które nie przekraczają określonych wartości
  51. $tablica_load2= array();
  52. foreach($tablica_load as $klucz_load => $wartosc_load)
  53. {
  54. if($wartosc_load < '1.50')
  55. {
  56. $tablica_load2[$klucz_load] = $wartosc_load;
  57. }
  58. }
  59.  
  60. $tablica_upload2= array();
  61. foreach($tablica_upload as $klucz_upload => $wartosc_upload)
  62. {
  63. if($wartosc_upload < '95.00')
  64. {
  65. $tablica_upload2[$klucz_upload] = $wartosc_upload;
  66. }
  67. }
  68.  
  69. $tablica_download2= array();
  70. foreach($tablica_download as $klucz_download => $wartosc_download)
  71. {
  72. if($wartosc_download < '90.00')
  73. {
  74. $tablica_download2[$klucz_download] = $wartosc_download;
  75. }
  76. }
  77.  
  78. $tablica_memory_free2= array();
  79. foreach($tablica_memory_free as $klucz_memory_free => $wartosc_memory_free)
  80. {
  81. if($wartosc_memory_free > '100.00')
  82. {
  83. $tablica_memory_free2[$klucz_memory_free] = $wartosc_memory_free;
  84. }
  85. }
  86.  
  87. $tablica_memory_usage2= array();
  88. foreach($tablica_memory_usage as $klucz_memory_usage => $wartosc_memory_usage)
  89. {
  90. if($wartosc_memory_usage < '1900.00')
  91. {
  92. $tablica_memory_usage2[$klucz_memory_usage] = $wartosc_memory_usage;
  93. }
  94. }
  95.  
  96. $tablica_cpu_usage2= array();
  97. foreach($tablica_cpu_usage as $klucz_cpu_usage => $wartosc_cpu_usage)
  98. {
  99. if($wartosc_cpu_usage < '90.00')
  100. {
  101. $tablica_cpu_usage2[$klucz_cpu_usage] = $wartosc_cpu_usage;
  102. }
  103. }
  104.  
  105. unset($tablica_load);
  106. unset($tablica_upload);
  107. unset($tablica_download);
  108. unset($tablica_memory_free);
  109. unset($tablica_memory_usage);
  110. unset($tablica_cpu_usage);
  111.  
  112. echo '<b>Serwery, które nie przekraczają określonych wartości:</b> <br />';
  113. print_r($tablica_load2);
  114. echo '<br />';
  115. print_r($tablica_upload2);
  116. echo '<br />';
  117. print_r($tablica_download2);
  118. echo '<br />';
  119. print_r($tablica_memory_free2);
  120. echo '<br />';
  121. print_r($tablica_memory_usage2);
  122. echo '<br />';
  123. print_r($tablica_cpu_usage2);
  124. echo '<br /><br /><br /><br />';
  125.  
  126.  
  127. // wybieramy najmniejsze wartości z tych serwerów które nie przekroczyły wartości maksymalnych
  128. // od najmniejszej do największej
  129. function cmp($a, $b)
  130. {
  131. if ($a == $b)
  132. {
  133. return 0;
  134. }
  135. return ($a < $b) ? -1 : 1;
  136. }
  137. // od największej do najmniejszej
  138. function cmp2($a, $b)
  139. {
  140. if ($a == $b)
  141. {
  142. return 0;
  143. }
  144. return ($a > $b) ? +1 : 1;
  145. }
  146. // najmniejsza wartość
  147. uasort($tablica_load2, 'cmp');
  148. uasort($tablica_upload2, 'cmp');
  149. uasort($tablica_download2, 'cmp');
  150. uasort($tablica_memory_free2, 'cmp2');
  151. uasort($tablica_memory_usage2, 'cmp');
  152. uasort($tablica_cpu_usage2, 'cmp');
  153.  
  154. echo '<b>Serwery posortowane według najmniejszego obciażenia:</b> <br />';
  155. print_r($tablica_load2);
  156. echo '<br />';
  157. print_r($tablica_upload2);
  158. echo '<br />';
  159. print_r($tablica_download2);
  160. echo '<br />';
  161. print_r($tablica_memory_free2);
  162. echo '<br />';
  163. print_r($tablica_memory_usage2);
  164. echo '<br />';
  165. print_r($tablica_cpu_usage2);
  166. echo '<br /><br /><br /><br />';
  167.  
  168.  
  169. // wybieranie wartości z najmniej obciazonych serwerów
  170. list ($klucz_load, $wartosc_load) = each ($tablica_load2);
  171. $serwer_load = $klucz_load;
  172.  
  173. list ($klucz_uplaod, $wartosc_upload) = each ($tablica_upload2);
  174. $serwer_upload = $klucz_uplaod;
  175.  
  176. list ($klucz_download, $wartosc_download) = each ($tablica_download2);
  177. $serwer_download = $klucz_download;
  178.  
  179. list ($klucz_memory_free, $wartosc_memory_free) = each ($tablica_memory_free2);
  180. $serwer_memory_free = $klucz_memory_free;
  181.  
  182. list ($klucz_memory_usage, $wartosc_memory_usage) = each ($tablica_memory_usage2);
  183. $serwer_memory_usage = $klucz_memory_usage;
  184.  
  185. list ($klucz_cpu_usage, $wartosc_cpu_usage) = each ($tablica_cpu_usage2);
  186. $serwer_cpu_usage = $klucz_cpu_usage;
  187.  
  188.  
  189. // tablica najmniej obciążonych serwerów
  190. $tablica_najmniej_obciazone = array($serwer_load, $serwer_upload, $serwer_download, $serwer_memory_free, $serwer_memory_usage, $serwer_cpu_usage);
  191.  
  192. echo '<b>Tablicza najmniej obciazonych serwerow:</b> <br />';
  193. print_r($tablica_najmniej_obciazone);
  194. echo '<br /><br />';
  195.  
  196. // zliczanie wystepowania
  197. $tablica_najczesciej_wystepuje = array_count_values($tablica_najmniej_obciazone);
  198.  
  199. echo '<b>Najczesciej wystepujace:</b> <br />';
  200. print_r($tablica_najczesciej_wystepuje);
  201.  
  202. // pobieranie 1 klucz
  203. list ($klucz_serwer, $wartosc_serwer) = each ($tablica_najczesciej_wystepuje);
  204. $serwer = $klucz_serwer;
  205.  
  206. echo '<br /><b>Wreszcie koniec. Ten serwer jest najmniej obciazony: '.$serwer.'</b>';


Wiem, że da się to zawrzeć o połowę mniej kodu ale cóż. Pierwsza wersja jest.
CuteOne
Radzę poczytać o możliwościach php w kwestii zabawy z tablicami bo Twój kod to masakra smile.gif poczytaj też o min(), max()
-jarek-
Cytat(darko @ 31.08.2011, 00:30:56 ) *
~-jarek- problem nie leży w doborze algorytmu sortowania, a w doborze klucza, a właściwie wag dla poszczególnych kryteriów sortowania, a tych jest kilka:
- ogólne obciążenie
- zużycie pamięci
- zużycie procesora


Dlatego właśnie jest to najlepszy algorytm do tego celu.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.