Sortiranje fajla

Sortiranje fajla

offline
  • igor86  Male
  • Stručni saradnik
    Web programiranje
  • Pridružio: 24 Maj 2006
  • Poruke: 1633

Naime, potrebno je da nadjem unique redove u jednom fajlu, koji ima 30 000 000 redova. Iz samog razloga sto sav sadrzaj ne moze da stane u memoriju, citaj niz, moram prvo izvrsiti sortiranje redova u drugi fajl. Kako najbrze?



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • PHP developer
  • Pridružio: 22 Mar 2006
  • Poruke: 3760
  • Gde živiš: 127.0.0.1

probaj ovo, ja nisam probao jer nemam sa cim, ali na php.net kazu da radi sa velikim fajlovima:

php.net - function fgets ::When working with VERY large files, php tends to fall over sideways and die.

Here is a neat way to pull chunks out of a file very fast and won't stop in mid line, but rater at end of last known line. It pulled a 30+ million line 900meg file through in ~ 24 seconds.

NOTE:
$buf just hold current chunk of data to work with. If you try "$buf .=" (note 'dot' in from of '=') to append $buff, script will come to grinding crawl around 100megs of data, so work with current data then move on!

  1. <?php
  2. //File to be opened
  3. $file = "huge.file";
  4. //Open file (DON'T USE a+ pointer will be wrong!)
  5. $fp = fopen($file, 'r');
  6. //Read 16meg chunks
  7. $read = 16777216;
  8. //\n Marker
  9. $part = 0;
  10.  
  11. while(!feof($fp)) {
  12.    $rbuf = fread($fp, $read);
  13.    for($i=$read;$i > 0 || $n == chr(10);$i--) {
  14.        $n=substr($rbuf, $i, 1);
  15.        if($n == chr(10))break;
  16.        //If we are at the end of the file, just grab the rest and stop loop
  17.        elseif(feof($fp)) {
  18.            $i = $read;
  19.            $buf = substr($rbuf, 0, $i+1);
  20.            break;
  21.        }
  22.    }
  23.    //This is the buffer we want to do stuff with, maybe thow to a function?
  24.    $buf = substr($rbuf, 0, $i+1);
  25.    //Point marker back to last \n point
  26.    $part = ftell($fp)-($read-($i+1));
  27.    fseek($fp, $part);
  28. }
  29. fclose($fp);
  30. ?>


Nadam se da ovo moze da ti pomogne Smile



offline
  • igor86  Male
  • Stručni saradnik
    Web programiranje
  • Pridružio: 24 Maj 2006
  • Poruke: 1633

Sumnjam, ali u svakom slucaju hvala

offline
  • Peca  Male
  • Glavni Administrator
  • Predrag Damnjanović
  • SysAdmin i programer
  • Pridružio: 17 Apr 2003
  • Poruke: 23211
  • Gde živiš: Niš

jedino da ubacis sve u sql tabelu, cija ce kolona koja sadrzi vrednosti biti index kolona...
sql ce to indexirati, pa onda radi order i select...where po volji...

offline
  • Pridružio: 01 Maj 2003
  • Poruke: 1300
  • Gde živiš: Kragujevac

@peca

to mi izgleda kao jedino resenje. sve ostalo ti je zeznuto i 'komplikovano'

offline
  • igor86  Male
  • Stručni saradnik
    Web programiranje
  • Pridružio: 24 Maj 2006
  • Poruke: 1633

Linux ima program sort, koji pozivam da sortiram fajl, na nivou linije, a poslije toga je jednostavno iz fajla izvuci unique. Tako da sam na taj nacin to sredio

Ko je trenutno na forumu
 

Ukupno su 938 korisnika na forumu :: 50 registrovanih, 4 sakrivenih i 884 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: A.R.Chafee.Jr., acatomic, ajo baba, ALEXV, amaterSRB, arezina, Asparagus, avijacija, bbogdan, belov, bestguarder, blatruc82, Bobrock1, bolimejoli, BORUTUS, coaaco, cojapop, Dovla, Dovla 1980, draganl, dusan.l, Dzigy, Feller, filip1326, Georgius, goran.vvv, jodzula, Kaplar2, kreker, ljuba.b, menk, mercedesamg, metallac777, nenaddz, NNPD, nobutado, Parker, Prašinar, prikolica, Razvigor.SRB, Saša1989, sistem22, sluga, Vanderx, Veselimalisa, vidra1, wizzardone, Zrcalo, šakalakazu, 79693