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

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 61
    Points : 35
    Points
    35
    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 expérimenté 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
    Points : 1 311
    Points
    1 311
    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 émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 021
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 021
    Points : 2 278
    Points
    2 278
    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
    Vive les roues en pierre

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 154
    Points : 168
    Points
    168
    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

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 61
    Points : 35
    Points
    35
    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

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

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

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 61
    Points : 35
    Points
    35
    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".

  8. #8
    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
    Points : 1 186
    Points
    1 186
    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 )

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 61
    Points : 35
    Points
    35
    Par défaut
    excellent ce script, merci !!!!!!!!
    Mais je peux integrer le filtrage pour les warning et autre critical ?
    j'essaye de le faire sur la variable output mais apparemment il n'aime pas ça !
    merci

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 61
    Points : 35
    Points
    35
    Par défaut
    bon finalement c'est bien mais :
    - le tail n'affiche pas les dernieres lignes en 1er
    - il n'y a pas de retour chariot, du coup les lignes font 3 ecrans de long (pb que je n'ai pas avec le script ci-dessus

    c'est dommage, c'etait super

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 154
    Points : 168
    Points
    168
    Par défaut
    - Il est plus simple et plus rapide d'inverser l'ordre des lignes d'un fichier de 50 lignes que de traiter un fichier de 250Mo comme tu le faisais
    - le tail t'affiche le contenu exact de tes 50 dernières lignes. Dans ton cas deux choses : soit tu n'as pas de sauts de lignes dans ton fichier au départ et dans ce cas tu peux toujours les ajouter en parsant ton fichier, soit tu fais la triste mais célèbre erreur de travailler sur windows, alors que ton fichier a été créé sur linux. Dans ce cas il te suffit de remplacer dans ton fichier les caractères de saut de ligne \n par \r
    Dans ces deux cas tu auras de meilleures perf avec tail

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 61
    Points : 35
    Points
    35
    Par défaut
    soit tu fais la triste mais célèbre erreur de travailler sur windows, alors que ton fichier a été créé sur linux. Dans ce cas il te suffit de remplacer dans ton fichier les caractères de saut de ligne \n par \r
    Dans ces deux cas tu auras de meilleures perf avec tail
    "de travailler sur windows, alors que ton fichier a été créé sur linux ": et c'est mon cas, mais le probleme ne se situe pas au niveau des retours de fin de ligne, mais au niveau du redimensionnement, c'est à dire qu'une même ligne de 3 ecrans de long sera automatiquement découpé pour tenir sur 3 lignes avec le script 1, mais restera sur une seule ligne avec le tail

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