Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: przyspieszenie wczytywania csv/przejscie na baze danych
Forum PHP.pl > Forum > PHP
n0n3
Witam.
Potrzebowalem napisac skrypt ktory dane wyeksportowane z programu kontroli godzin pracy odpowiednio przetworzy i wyswietli informacje ze w wybranym dniu o wybranej godzinie bylo tylu a tylu pracownikow. I tutaj mam pewien problem skrypt dziala i strona sie ladnie generuje ale odczyt z pliku trwa okolo 4sekund (cala strona generuje sie w 4,5s) format pliku wejsciowego to csv:
Kod
00002;09;01;01;06;01;1
00090;09;01;01;18;37;0
...


plik wczytuje poprzez:
Kod
...
$pliczek=file("lista.csv");
foreach($pliczek as $test){
...


czy mozna w jakis sposob przyspieszyc wczytywanie pliku -zastapic funkcje file() czy moze lepiej skozystac z bazy?

PS: plik jest tylko odczytywany. przy aktualizacji danych caly jest zastepowany nowym. Niemam duzego doswiadczenia w PHP
wookieb
A ile jest w nim linijek?
Możesz spróbować użycia innych funkcji typu
fopen + fgetcsv
Kocurro
Rozwiązanie całkiem błędne - najpierw wczytujesz plik do pamięci tworząc z niego tablicę a potem iteracja po każdym wierszu. Wczytuje linia po linii i uzyskasz lepszy efekt.

To na szybko co możesz zrobić. Aby powiedzieć co dalej masz źle musisz pokazać resztę kodu
n0n3
Wczytywanie linijka po linijce jest wolniejsze o ok 0,4s.

dane sa wczytane z pliku csv i odfiltrowane na podstawie daty i czasu. pozycje ktore spelniaja warunek (odpowiednia data i czas) sa zliczone i wyswietlone.
Jesli mozna to zrobic w jakis madrzejszy sposob to prosze o rade.

dodam jeszcze ze niejest to hosting tylko apache i php na slabszym PC postawione.

predkosc sortowania itd jest ok tylko czas ladowania z pliku chcialbym obciac... (plik aktualnie 2100kb)

Kod
if (file_exists("lista\aktu.txt")) {    // jesli aktualizuje liste to:
        exit("aktualizuje baze danych... prosze chwile poczekac i sprobowac ponownie <br />");
    }

    $ile_osob = 0;
    $ile_biuro = 0;
    $ile_tech = 0;
    $ile_mag_drv= 0;
        
    $stan_rok  = $_REQUEST["rok"];
    $stan_mies = $_REQUEST["miesiac"];
    $stan_dzien= $_REQUEST["dzien"];
    $stan_godz = $_REQUEST["godzina"];
    $stan_minuta=$_REQUEST["minuta"];
    
    $lista=array();

    // ScriptTimer::timing_milestone('czytam plik');
    
    $pliczek=file("lista\bibi_eksport.txt");            // czytaj do tablicy
    foreach($pliczek as $test){                            // kazdy element
        $kawalki=explode(';',$test);
        $os_nr=$kawalki[0];
        $os_data_rok=$kawalki[1];
        if($os_data_rok!=$stan_rok){                    // jak data zla to nastepny element
            continue;
        }
        $os_data_miesiac=$kawalki[2];
        if($os_data_miesiac!=$stan_mies){
            continue;
        }
        $os_data_dzien=$kawalki[3];
        if($os_data_dzien!=$stan_dzien){
            continue;
        }        
        $os_godz_godz=$kawalki[4];
        $os_godz_minuta=$kawalki[5];
        if((int)$kawalki[6]==0){                        // jesli data ok to godziny do tablic
            $sprawdzam_in[$os_nr]=array("godz_in"=>$os_godz_godz,"min_in"=>$os_godz_minuta);
        }else{
            $sprawdzam_out[$os_nr]=array("godz_out"=>$os_godz_godz,"min_out"=>$os_godz_minuta);        
        };
        
        array_push($lista,$os_nr);                        // dodaj pozycje
    }
    
    // ScriptTimer::timing_milestone('plik wczytany');
    
    $lista=array_unique($lista);                        // posortuj i wyrzuc powtarzajace sie
    sort($lista);
    foreach($lista as $i){                                // dla zostawionych elementow
        if($sprawdzam_in[$i]["godz_in"]<=$sprawdzam_out[$i]["godz_out"]){    // jesli dzien to posortuj
            if(spr_in($sprawdzam_in[$i]["godz_in"],$sprawdzam_in[$i]["min_in"],$stan_godz,$stan_minuta)){
                if(spr_out($sprawdzam_out[$i]["godz_out"],$sprawdzam_out[$i]["min_out"],$stan_godz,$stan_minuta)){
                    if(w_liscie($li_biurowiec,$i)){        // wylap biurowych
                        $ile_biuro++;
                    }else{
                        if(w_liscie($li_tech,$i)){        // wylap technicznych
                            $ile_tech++;
                        }else{
                            if(w_liscie($li_mag_drv,$i)){    // wylap magaynierow i kierowcow
                                $ile_mag_drv++;
                            }else{
                                $ile_osob++;                // reszta
                            }
                        }
                    }
                }
            }            
        }else{                                                                // jesli noc to posortuj
            if(spr_in($sprawdzam_in[$i]["godz_in"],$sprawdzam_in[$i]["min_in"],$stan_godz,$stan_minuta)){
                if(w_liscie($li_biurowiec,$i)){
                    $ile_biuro++;
                }else{
                    if(w_liscie($li_tech,$i)){
                        $ile_tech++;
                    }else{
                        if(w_liscie($li_mag_drv,$i)){
                            $ile_mag_drv++;
                        }else{
                            $ile_osob++;
                        }
                    }
                }
            }
            if(spr_out($sprawdzam_out[$i]["godz_out"],$sprawdzam_out[$i]["min_out"],$stan_godz,$stan_minuta)){
                if(w_liscie($li_biurowiec,$i)){
                    $ile_biuro++;
                }else{
                    if(w_liscie($li_tech,$i)){
                        $ile_tech++;
                    }else{
                        if(w_liscie($li_mag_drv,$i)){
                            $ile_mag_drv++;
                        }else{
                            $ile_osob++;
                        }
                    }
                }
            }
        }
    }


oraz uzyte "funkcje"
Kod
function spr_in($in_h,$in_m,$set_h,$set_m){
    if($in_h<$set_h){
        return TRUE;
    }
    if($in_h==$set_h){
        if($in_m<=$set_m)
            return TRUE;
    }
    return FALSE;
}

function spr_out($out_h,$out_m,$set_h,$set_m){
    if($out_h>$set_h){
        return TRUE;
    }
    if($out_h==$set_h){
        if($out_m>$set_m)
            return TRUE;
    }
    return FALSE;
}

function w_liscie($list,$nr){
    foreach($list as $i){
        if($i==$nr)
            return TRUE;
    }
    return FALSE;
}
Kocurro
Hej,

normalnie nie robię za kogoś gotowych skryptów - ale połechtałeś moją próżność. Wieczorem jak wrócę z pracy to się przyjrzę temu i spróbuję znaleźć jak najwięcej możliwych miejsc gdzie można przyśpieszyć.

Pozdrawiam
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.