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 :

[CSV] Libération de la mémoire


Sujet :

Langage PHP

  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2002
    Messages
    299
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2002
    Messages : 299
    Points : 373
    Points
    373
    Par défaut [CSV] Libération de la mémoire
    Bonne année à tous et bonjour,

    Avec un php 4.2.2/linux compilé avec memory_limit, et memory_limit à 16M dans le php.ini, je lance un script simple qui lit le contenu des fichiers d'un dossier. Quand y'a trop de fichiers, le script plante au bout de quelques fichiers avec le message suivant
    Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 81 bytes) in /var/www/html/outils/logs.php on line 106
    sur la ligne
    $file=file($chemin.$fichier);
    Si je commente cette ligne, ça passe mieux mais le script évidement ne sert à rien.

    Je fais pourtant des unset des variables créées dans la boucle à la fin de chaque itération. Est-ce cette version de PHP? Est-ce autre chose?

  2. #2
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2002
    Messages
    299
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2002
    Messages : 299
    Points : 373
    Points
    373
    Par défaut
    précision, le même script passe bien sur un 4.3 windows (mais les php.ini ont d'autres différences donc difficile de copier simplement et je ne trouve pas la différence qui justifierait cela, les deux étant à memory_limit 8Mo)

  3. #3
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    fais voir ta boucle ?

  4. #4
    Membre averti
    Avatar de Julien.alkaza
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    239
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 239
    Points : 363
    Points
    363
    Par défaut
    A tout hazard : cela ne pourait pas venir de la mémoire VIVE asociée au process de PHP???

  5. #5
    Membre éclairé
    Avatar de Kioob
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Points : 764
    Points
    764
    Par défaut
    Et bien au lieu de charger tout le contenu du fichier en mémoire (ce que fait la fonction file() ), traite tes fichiers par petit morceaux !

    D'autant plus que visiblement tu travailles ligne par ligne. Il te suffit donc de boucler avec feof + fgets et le tour est joué.

    Imagine que tu doives travailler avec un fichier CSV de 2Go, tu vas vraiment chercher à le charger entièrement en mémoire ? Et pour lire une video de 4Go ?

  6. #6
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2002
    Messages
    299
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2002
    Messages : 299
    Points : 373
    Points
    373
    Par défaut
    La boucle est celle ci
    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
    while($fichier=$dir->read()) if(EstFichierDeLog($fichier, $machines, $logiciels, $machine, $logiciel))
    	{
    	$nbfichiers++;
        $tab=array();
    	$file=file($chemin.$fichier);
    	reset($file);
    	foreach($file as $id=>$ligne)
    		{
    		$ligne=explode(';', $ligne);
    		$dates[$id]=$ligne[0];
    		unset($ligne[0]);
    		$file[$id]=implode(';', $ligne);
    		}
     
    	if(isset($_GET['doublons'])) $file=array_unique($file);
    	reset($file);
    	foreach($file as $id=>$ligne) if(EstLigneDErreur($ligne, isset($_GET['ignore']))) $tab[]=$dates[$id].';'.$ligne;
    	$texte.=AfficheLesEventuellesErreurs($fichier, $tab, &$nbfichiersErreurs);
    	}
    Julien.alkaza : je ne comprend pas la question, ça ne peut pas être autre chose que de la mémoire vive, de travail.

    Kioob : ce n'est pas dépendant de la taille des fichiers, mais de leur nombre, comme si chaque itération ne libérait pas la mémoire qu'elle utilise et que le contenu de chaque fichier restait en mémoire jusqu'à la mort du script. Dans le code ci dessus, si je commente le file(), plus de soucis de mémoire. Si je le remplace, c'est pire. Des unset() en fin de boucle sur $file et $tab ne font rien.

  7. #7
    Membre éclairé
    Avatar de Kioob
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Points : 764
    Points
    764
    Par défaut
    Je reste persuadé que tu n'as absolument pas besoin de file() ici.


    Mais s'il y a vraiment un problème de mémoire, change de version de PHP, passe au moins à la 4.2.3... même si un passage à la 4.3.x ne ferait pas de mal, voir même à la version 5.

  8. #8
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2002
    Messages
    299
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2002
    Messages : 299
    Points : 373
    Points
    373
    Par défaut
    Je suis d'accord que file() est inutile, mais j'ai essayé sans, et cela n'a pas résolu le problème. Tu semble confirmer que la 4.2.2 pourrait être responsable, dommage, la RH9 date sérieusement :-(
    merci

Discussions similaires

  1. LIbération de la mémoire
    Par Premium dans le forum C
    Réponses: 3
    Dernier message: 27/11/2006, 10h33
  2. Libération de la mémoire
    Par Premium dans le forum C
    Réponses: 4
    Dernier message: 09/08/2006, 18h15
  3. libération de la mémoire après traitement ?
    Par isachat666 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 07/12/2005, 19h29
  4. [VB]Libération de la mémoire
    Par seroa dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 12/10/2005, 11h52
  5. Libération de la mémoire
    Par gibet_b dans le forum Composants VCL
    Réponses: 3
    Dernier message: 30/06/2004, 12h02

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