Visualizzazione dei risultati da 1 a 8 su 8

Discussione: [php] complessità

  1. #1

    [php] complessità

    ho questo script

    Codice PHP:
    for($i=0;$i<$righeRipulita;$i++)

         
    $riga2 explode(",",$venditaRipulita[$i]);
        for(
    $j=0;$j<$righeRagruppata;$j++)
         {
            
    $riga3 explode(",",$matrice[$j]);
            if(
    $riga2[0]==$riga3[0]) 
             {
                if(
    $riga2[1]==substr($riga3[1],0,3))
                  {    
                    if(
    $riga2[3]=="\"2005\"\r\n")
                     {
                        
    $riga3[2] = $riga2[2];
                        
    $matrice[$j] = implode(",",$riga3); 
                    }elseif(
    $riga2[3]=="\"2006\"\r\n")
                    {
                        
    $riga3[3] = $riga2[2];
                        
    $matrice[$j] = implode(",",$riga3);
                    }else
                    {
                        
    $riga3[4] = $riga2[2]."\r";
                        
    $matrice[$j] = implode(",",$riga3);
                    }
                }
            }
        }
        

    il problema credo che sia l'elevato valore di $righeRipulita(20.000) e $righeRagruppata(20.000) x un totale di 400.000.000 di operazioni

    infatti quando lo faccio partire carica per un po e poi non mi da nessun risultato e nessun errore

    ora mi chiedevo c'è un modo per evitare che c'ho accada?(modifica dello script/modifica dei settaggi)

    ho settato il file php.ini con questi valori :

    max_execution_time = 480
    max_input_time = 240
    memory_limit = 512M

    ma non va lo stesso

  2. #2
    Utente di HTML.it L'avatar di gianiaz
    Registrato dal
    May 2001
    Messaggi
    8,027
    prova con

    codice:
    set_time_limit(0);
    cosi setti a infinito il valore del tempo dopo il quale lo script va in timeout, anche se in questo caso dovrebbe appunto mostrarti il messaggio relativo.

    Come hai settato l'output degli errori?
    Non è che non mostra nulla perchè è cosi che è stato settato nel file php.ini?

    ciao

  3. #3
    Ma ti rendi conto che il tuo script fa operazioni pesantissime per il server non riesci ad ottimizzare il codice? Tra l'altro da come costruito è facile che lanci un ciclo infinito se non inserisci dei controlli sui valori di for.

    Ti consiglio di rivedere la tua struttura

  4. #4
    rispondo in ordine

    @gianiaz

    ho settato nel php.ini il max_execution_time a 4000 e adesso lo sto lasciando girare per vedere se arriva da qualche parte...errori non ce ne dovrebbero essere xkè con meno dati ho provato e funziona cmq gli errori me li mostra solitamente

    @silverwings

    si me ne rendo conto ma è il mio primo script e non sono (almeno fino ad ora) riuscito a migliorarlo cmq il codice che ho messo non è lo script completo ho messo solo la parte incriminata...non dovrebbe lanciare un ciclo infinito xkè $righeRIpulita e $righeRagruppata sono finiti...o c'è qualcosa che mi sta sfuggendo?

  5. #5
    Utente di HTML.it L'avatar di gianiaz
    Registrato dal
    May 2001
    Messaggi
    8,027
    Originariamente inviato da Mandalayawantic
    rispondo in ordine

    @gianiaz

    ho settato nel php.ini il max_execution_time a 4000 e adesso lo sto lasciando girare per vedere se arriva da qualche parte...errori non ce ne dovrebbero essere xkè con meno dati ho provato e funziona cmq gli errori me li mostra solitamente

    @silverwings

    si me ne rendo conto ma è il mio primo script e non sono (almeno fino ad ora) riuscito a migliorarlo cmq il codice che ho messo non è lo script completo ho messo solo la parte incriminata...non dovrebbe lanciare un ciclo infinito xkè $righeRIpulita e $righeRagruppata sono finiti...o c'è qualcosa che mi sta sfuggendo?
    perchè settarlo proprio a 4000?
    quello che oggi viene eseguito in 3950 secondi, domani con un carico di processore diverso potrebbe comunque sforare, mettendolo a 0 stai tranquillo.

    per la risposta che hai dato a silverwings, visto che è il tuo primo script potresti provare a spiegare meglio il problema cosi magari ti si suggerisce una soluzione migliore.

    Ciao

  6. #6
    Originariamente inviato da gianiaz
    perchè settarlo proprio a 4000?
    quello che oggi viene eseguito in 3950 secondi, domani con un carico di processore diverso potrebbe comunque sforare, mettendolo a 0 stai tranquillo.

    per la risposta che hai dato a silverwings, visto che è il tuo primo script potresti provare a spiegare meglio il problema cosi magari ti si suggerisce una soluzione migliore.

    Ciao
    si hai ragione è meglio così

    ma tu dici di inserire la funzione "set_time_limit" nello script giusto?

    per il resto posto lo script completo così magari si capisce meglio

    Codice PHP:
    <?php

    $venditaRagruppata 
    file('C:\Documents and Settings\Salvo\Desktop\GiovanniClaudio\file da importare\Export FOCUS\venditaragruppata.csv'); //mette in $venditaRagruppata il contenuto di venditaragruppata.txt

    $venditaRipulita file('C:\Documents and Settings\Salvo\Desktop\GiovanniClaudio\file da importare\Export FOCUS\venditaripulita.csv'); 

    $righeRagruppata count($venditaRagruppata); //conta gli elementi dell'array 

    $righeRipulita count($venditaRipulita);

    //crea la struttura della tabella eliminando e aggiungendo dove occore i caratteri di fine riga
    for($x=0;$x<$righeRagruppata;$x++)
    {
        
    $riga explode(",",$venditaRagruppata[$x]);
        
    $riga[1] = substr($riga[1],0,3);
        
    $riga[2] = "\"\"";//aggiunto 
        
    $riga[3] = "\"\"";
        
    $riga[4] = "\"\"";
        
    $riga[4] = $riga[4]."\r";
        
    $matrice[$x] = implode(",",$riga);
    }

    //scorre le righe di venditaRipulita e fa dei controlli riga per riga inserendo i valori delle vendite per ogni anno 
    for($i=0;$i<$righeRipulita;$i++)

         
    $riga2 explode(",",$venditaRipulita[$i]);
        for(
    $j=0;$j<$righeRagruppata;$j++)
         {
            
    $riga3 explode(",",$matrice[$j]);
            if(
    $riga2[0]==$riga3[0]) 
             {
                if(
    $riga2[1]==substr($riga3[1],0,3))
                  {    
                    if(
    $riga2[3]=="\"2005\"\r\n")
                     {
                        
    $riga3[2] = $riga2[2];
                        
    $matrice[$j] = implode(",",$riga3); 
                    }elseif(
    $riga2[3]=="\"2006\"\r\n")
                    {
                        
    $riga3[3] = $riga2[2];
                        
    $matrice[$j] = implode(",",$riga3);
                    }else
                    {
                        
    $riga3[4] = $riga2[2]."\r";
                        
    $matrice[$j] = implode(",",$riga3);
                    }
                }
            }
        }
        
    }

    //scrive riga per riga tutto il file VenditaPerAnni.txt
    $handle fopen("C:\Documents and Settings\Salvo\Desktop\GiovanniClaudio\file da importare\Export FOCUS\VenditaPerAnni.txt","w");

    for (
    $j=0;$j<$righeRagruppata;$j++)
    {
         
    fwrite($handle,$matrice[$j]);
    }

    fclose($handle);

    ?>

  7. #7
    Utente di HTML.it L'avatar di gianiaz
    Registrato dal
    May 2001
    Messaggi
    8,027
    Originariamente inviato da Mandalayawantic
    si hai ragione è meglio così

    ma tu dici di inserire la funzione "set_time_limit" nello script giusto?
    si, cosi la modifica è solo per lo script e non per tutti.

    Per quanto riguarda il codice, spiega cosa devi fare e come lo fai, poi guardiamo il codice, cosi senza spiegazione ha poco senso.

    ciao

  8. #8
    in pratica ho una tabella nel mio database che contiene le vendite di 3 anni(05/06/07) dove ogni riga è così composta:

    filiale - prodotto - quantità - anno

    e devo invece ottenere una tabella con questa struttura:

    filiale - prodotto - quantità05 - quantità06 - quantità07

    ho pensato dunque di fare uno script in php per crearmi una matrice che abbia la forma desiderata

    lo script prende in input la tabella delle vendite (venditaRipulita) e un'altra tabella che ha solo le colonne filiale e prodotto e che contiene tutte le coppie (filiale, prodotto) di venditaRipulita ripetute una sola volta

    Codice PHP:
    $venditaRagruppata file('C:Documents and SettingsSalvoDesktopGiovanniClaudiofile da importareExport FOCUSvenditaragruppata.csv'); //mette in $venditaRagruppata il contenuto di venditaragruppata.txt

    $venditaRipulita file('C:Documents and SettingsSalvoDesktopGiovanniClaudiofile da importareExport FOCUSvenditaripulita.csv'); 
    dopo di che esegue un ciclo for per creare la matrice che deve avere la stessa dimensione di venditaRagruppata ma qualche colonna in + per ogni riga

    Codice PHP:
    for($x=0;$x<$righeRagruppata;$x++)
    {
        
    $riga explode(",",$venditaRagruppata[$x]);
        
    $riga[1] = substr($riga[1],0,3);
        
    $riga[2] = "\"\"";//aggiunto
        
    $riga[3] = "\"\"";
        
    $riga[4] = "\"\"";
        
    $riga[4] = $riga[4]."\r";
        
    $matrice[$x] = implode(",",$riga);

    a questo punto faccio i 2 for annidati xkè devo scorrere tutta la tabella venditaRipulita e controllare per ogni sua riga che esista la stessa coppia nella tabella venditaRagruppata...se esiste allora vado a guardare nella tabella venditaRipulita l'anno di vendita e la quantità di prodotto venduto che andrò ad insierire nella matrice nella colonna apposita

    Codice PHP:
    if($riga2[0]==$riga3[0])
            {
                if(
    $riga2[1]==substr($riga3[1],0,3))
                 {    
                    if(
    $riga2[3]=="\"2005\"\r\n")
                    {
                        
    $riga3[2] = $riga2[2];
                        
    $matrice[$j] = implode(",",$riga3);
                    }elseif(
    $riga2[3]=="\"2006\"\r\n")
                    {
                        
    $riga3[3] = $riga2[2];
                        
    $matrice[$j] = implode(",",$riga3);
                    }else
                    {
                        
    $riga3[4] = $riga2[2]."\r";
                        
    $matrice[$j] = implode(",",$riga3);
                    }
                }
            } 
    alla fine scrivo il contenuto di matrice nel file venditaPerAnni.txt

    Codice PHP:
    $handle fopen("C:Documents and SettingsSalvoDesktopGiovanniClaudiofile da importareExport FOCUSVenditaPerAnni.txt","w");

    for (
    $j=0;$j<$righeRagruppata;$j++)
    {
        
    fwrite($handle,$matrice[$j]);
    }

    fclose($handle);

    ?> 
    spero di essere stato chiaro

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.