IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Tableaux] Limite de mémoire [Fait]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 61
    Par défaut [Tableaux] Limite de mémoire
    bonjour



    j'ai un script php qui lit des (tres) gros fichiers texte.
    Le pb est que du coup j'ai le message suivant :

    Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 963142068 bytes)

    Bien qu'ayant augmenté la memoire dans le php.ini à 256 Mo !!!

    y-a-t-il un moyen de limiter cela, car je n'utilise que les 50 dernieres lignes du fichier

    Voilà le script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    $lines = file ("/home/log/$rep/$file");
    $dernieres_lignes = array_slice($lines, -50);
    $monTableauInverse = array_reverse ($dernieres_lignes, true);
    echo "<P align=center>";
    echo "<TABLE bgColor=#ffd7ff border=1>";
    echo "<TBODY>";
    foreach ($monTableauInverse as $line) {
    if ( strpos( $line , arning ) != 0 || strpos( $line , ritical ) !=0 )
    {
    $line1 = str_replace (array("info", "info"), "<span style='background-color:green;'>info</span>", $line);
    $line2 = str_replace (array("warning", "Warning"), "<span style='background-color:gold;'>warning</span>", $line1);
    $line3 = str_replace (array("critical","Critical"), "<span style='background-color:red;'>critical</span>", $line2);
            echo "<TD><TR>";
          echo $line3. "<br>";
            echo "</TD></TR>";
          }
          }
           ?>
           </TD></TR></TBODY></TABLE></P>
            </body></html>

    Merci pour votre aide !!!!!!!!

  2. #2
    Membre éprouvé Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Par défaut
    salut
    essaye de voir avec
    stream_get_contents http://fr2.php.net/manual/fr/functio...t-contents.php
    ou
    stream-get-line http://fr2.php.net/manual/fr/functio...m-get-line.php
    C'est des flux, donc je pense que tout n'est pas chargé en mémoire... à voir

  3. #3
    Membre éprouvé Avatar de bluemartini
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2006
    Messages : 154
    Par défaut
    regarde la fonction fgets qui retourne juste la ligne courante du fichier.
    Comme ça tu peux les lire une à une et les enregistrer seulement si elles correspondent

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 61
    Par défaut
    maxlength (entier)
    Le nombre maximal d'octets à lire. Par défaut, -1 (lit tout le contenu restant du buffer).

    offset (entier)
    Se déplace à la position spécifiée avant la lecture. Ajouté en PHP 5.1.0.


    le probleme etant que je ne peux pas definir a quel endroit commencer la lecture car il y a X fichiers de tailles différentes, et les tailles evoluent au fil du temps.
    De plus ce n'esr que la fin du fichier qui m'interesse (les 50 dernieres lignes)

    Merci

  5. #5
    Membre éprouvé Avatar de bluemartini
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2006
    Messages : 154
    Par défaut
    Sur Linux tu as la fonction tail...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 61
    Par défaut
    Citation Envoyé par bluemartini Voir le message
    Sur Linux tu as la fonction tail...
    et oui, mais je dois faire la meme chose en php (pour pouvoir visualiser au travers d'un navigateur), pour pouvoir ajouter ensuite des filtres sur les mots clefs "critical, info et warning".

  7. #7
    Inactif Avatar de CR_Gio
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 195
    Par défaut
    bonjour a tous
    (pour pouvoir visualiser au travers d'un navigateur)
    Il suffit de redirigé la sortie standar

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
     
    $filename='/path/file';
    $lines=10;
     
    $pid=exec('tail '.$filename.' -n '.$lines.' 2>&1 ', $output);
     
    echo '<pre>';
    print_r($output);
    echo '</pre>';
     
    ?>
    PS : Merci bluemartini pour cette superbe methode ( tail )

  8. #8
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Salut,
    à priori effectivement si tu lis le fichier ligne par ligne au lieu de le mettre dans un tableau avec file(). Tu peux utiliser fopen(), fgets(), etc.

    ci-dessous une fonction que j'avais codée qui te permet de récupérer n lignes à partir de la fin d'un fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    function readLines($file, $lines)	{
    	$handle = fopen($file, "r");
    	$pos = 0;
    	$output = "";
    	$status = 0;
    	for($nbLines = 0; $nbLines < $lines && $status !== -1; $nbLines++)	{
    		$char = "";
    		while($char != "\n" && (($status = fseek($handle, $pos--, SEEK_END)) !== -1)) {
    			$char = fgetc($handle);
    		}
    		$output[] = fgets($handle);
    	}
    	fclose($handle);
    	return array_reverse($output);
    }
     
    $lines = readLines("file.txt", 5);
    Bye

Discussions similaires

  1. ligne de commande et limite de mémoire
    Par syl15 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 27/08/2010, 09h15
  2. Limite de mémoire
    Par prosciuto dans le forum Langage
    Réponses: 5
    Dernier message: 27/10/2009, 12h27
  3. Réponses: 2
    Dernier message: 24/01/2008, 13h32
  4. [Tableaux] Taille en mémoire des différents fetch
    Par dorian53 dans le forum Langage
    Réponses: 4
    Dernier message: 18/07/2007, 12h46
  5. Limite Allocation Mémoire d'un tableau d'entier
    Par l9ft b9hind dans le forum C++
    Réponses: 5
    Dernier message: 27/10/2005, 19h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo