Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    Ottimizzare script php che si blocca per saturazione della ram

    Ciao a tutti

    Ho realizzato uni script che fa un cofronto fra due file
    il problema è che quando i file hanno migliaia di righe lo scrip si blocca per carenza di ram, infatti se aumento la ram a disposizione a 2gb poi torna a funzionare.

    Vorrei cercare di ottimizzarlo o trovare un'altro modo di fargli fare quello che fa ma purtroppo non sono così esperto e volevo chiedervi consiglio su come procedere.

    Provo a spiegarvi come funziona lo script:

    Leggo un file chiamiamolo "odierno" e lo metto in un file temporaneo che poi lo trasferisce in una variabile "$fcontent1".

    $filename1 = $pathlettura1;
    $handle1 = fopen($filename1, "r");
    $risultatocsv1 = stream_get_contents($handle1);
    fclose($handle1);
    if (!file_put_contents ($filenameCSV1,$risultatocsv1))
    {
    echo "Errore nella scrittura del file 1.{file_put_contents '$filenameCSV1'}";
    exit ;
    }

    $handle1 = fopen($filenameCSV1,'r');
    $fcontent1 = fread($handle1,filesize($filenameCSV1));
    fclose($handle1);
    unlink($filenameCSV1);
    $fcontent1=str_replace('"','',$fcontent1);
    $lines1 = explode("\n",$fcontent1);
    Leggo un'altro file chiamiamolo "precedente" e faccio le stesse operazioni.

    ora le operazioni che si susseguono sono per il confronto.
    il file come potete vedere dal codice è diviso in righe tramite \n.

    io prendo una riga del file odierno e la confronto riga per riga con tutto il file precedente

    durante il confronto se trova a seconda se trova la riga nel file precedente, se la trova modificata o se la trova uguale scrive una cosa in un array

    finito il confronto di una riga del file odierno con tutte quelle del precedente aggiunge la riga in una variabile chiamata output, poi passa alla riga successiva dell'odierno e ripete le operazioni di confronto

    una volta che tutto il file odierno è stato confrontato le ultime due operazioni che faccio sono
    - scrittura dell'array in una tabella di un db
    - scrittura in un file esterno della variabile output
    $output= substr($output,0,-1);//pulizia file
    $handle = fopen($pathrisultato.'/'.$nomerisultato.'.'.$estensione,'w');
    fwrite($handle,$output);
    fclose($handle);
    chmod($pathrisultato.'/'.$nomerisultato.'.'.$estensione, 0777);


    grazie in anticipo a tutti

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2009
    Messaggi
    636
    se confronti una riga del file odierno con tutte le righe del file precedente come fai a sapere che la prima è una versione modificata dell'ultima?

    Perchè leggi il file odierno, lo copi in un file temporaneo che rileggi per metterlo in un array?
    Leggilo una volta e man mano fai i dovuti confronti.

    Il comando 'file' legge i file riga per riga e ritorna un array quindi potresti fare semplicemente

    codice:
    foreach(file('odierno.est') as $rigaO){
        foreach(file('precedente.est') as $rigaP){
             //confronto tra $rigaO e $rigaP
       }
    }
    Se le righe dovessero essere molto lunghe considera la possibilità di confrontarne l'hash con sha1(limiteresti il confronto a 40 caratteri fissi). Comunque molto dipende da cosa vuoi fare di preciso da come sono strutturate le righe e probabilmente è sbagliato anche solo lavorare su file, ti sei mai posto la questione... non è meglio lavorare direttamente su database?

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 © 2026 vBulletin Solutions, Inc. All rights reserved.