Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Sortowanie duzych tablic
sivyer
post
Post #1





Grupa: Zarejestrowani
Postów: 57
Pomógł: 0
Dołączył: 17.04.2002
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Witam,

Mam nastepujacy problem. Musze posortowac dane z pliku CSV wedlug zadanej uprzednio kolumny (zawsze bedzie to liczba). Mozna to latwo i szybko zrobic, jesli linijek w pliku jest nawet do kilkunastu/kilkudziesieciu tysiecy, korzystajac z chocby asort() czy arsort().

W moim przypadku pliki beda mialy srednio po kilkaset tysiecy linijek, a czasem nawet grubo powyzej 1 mln, wiec rozwiazanie oparte o tablice, mimo ze nadal wykonuje sie w akceptowalnym czasie (dla 1mln ok 190sek), to po prostu zabija sprzet.

Przykladowa struktura pliku CSV:

Kod
Kolumna 1;Kolumna 2;Kolumna 3;Kolumna 4;Kolumna 5


I zalozmy ze chce posortowac te dane rosnaco po kolumnie 4. Ma ktos jakis pomysl jak zrobic to optymalnie (moze byc nawet ze strata czasowa, byleby nie pozeralo zbyt wielu zasobow serwera)?

Z gory dziekuje za wszelka pomoc
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
tiraeth
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 789
Pomógł: 41
Dołączył: 30.10.2003
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Prosty cvs reader potrafi zwrócić Ci coś takiego:
  1. <?php
  2. (
  3.  [0] = Array
  4.  (
  5. [Kolumna 1] = 2,
  6. [Kolumna 2] = 32,
  7. [Kolumna 3] = 415,
  8. [Kolumna 4] = 515,
  9. [Kolumna 5] = 222
  10.  ),
  11.  
  12.  [1] = Array ( )
  13. )
  14. ?>


Tak więc zmieniony przykład z manuala:

  1. <?php
  2. ?php
  3. foreach ($dane as $klucz => $wiersz) {
  4.  $KolumnaOne[$klucz] = $wiersz['Kolumna 1'];
  5.  $KolumnaTwo[$klucz] = $wiersz['Kolumna 2'];
  6.  $KolumnaThree[$klucz] = $wiersz['Kolumna 3'];
  7.  $KolumnaFour[$klucz] = $wiersz['Kolumna 4'];
  8.  $KolumnaFive[$klucz] = $wiersz['Kolumna 5'];
  9. }
  10.  
  11. // Należy podać $dane jako ostatni parametr aby posortować według wspólnego
  12. // klucza
  13. array_multisort($KolumnaFour, SORT_DESC, 
  14. $KolumnaOne, SORT_ASC, 
  15. $KolumnaTwo, SORT_ASC, 
  16. $KolumnaThree, SORT_ASC, 
  17. $KolumnaFive, SORT_ASC, $dane);
  18. ?>


Chyba powinno działać
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 16.10.2025 - 06:03