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 :

Probléme de Mémoire dans un tableau


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Homme Profil pro
    ray man
    Inscrit en
    Juillet 2009
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : ray man

    Informations forums :
    Inscription : Juillet 2009
    Messages : 274
    Points : 130
    Points
    130
    Par défaut Probléme de Mémoire dans un tableau
    Bonjour

    Je test un petit script qui gère des gros fichier texte (contient jusqu’à un million de ligne ).

    quant je travail avec un fichier de test qui contient 20 ligne le script marche très bien mais quant je load un gros fichier sa me donne cette erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 35 bytes) in C:\wamp\www\test\index.php on line 44
    La ligne 44 contient sa

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    $fichier="test.txt";
        $tabfich=file($fichier);
     
        $tab = Array();
        for( $i = 0 ; $i < count($tabfich) ; $i++ )
            $tab[$i]=$tabfich[$i];
     
        $tabD = array_unique($tab);//La ligne 44
    Cordialement

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    bah oui un million de lignes ça commence à peser.
    Avant de bidouiller la mémoire maximum allouée à un script est-ce qu'avec ce code ça passe ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
     
    $fichier = "test.txt";
    $tabfich = file($fichier);
     
    $tab = array();
    $nb  = count($tabfich);
    for($i = 0; $i < $nb ; ++$i) {
       $tab[$tabfich[$i]] = $i;
    }
     
    $tabD = array_flip($tab);
     
    ?>

  3. #3
    Membre habitué
    Homme Profil pro
    ray man
    Inscrit en
    Juillet 2009
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : ray man

    Informations forums :
    Inscription : Juillet 2009
    Messages : 274
    Points : 130
    Points
    130
    Par défaut
    voila l'erreur qui as donné votre code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 24 bytes) in C:\wamp\www\test.php on line 8

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Ok, quelle le poids du fichier à parser ?

  5. #5
    Membre habitué
    Homme Profil pro
    ray man
    Inscrit en
    Juillet 2009
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : ray man

    Informations forums :
    Inscription : Juillet 2009
    Messages : 274
    Points : 130
    Points
    130
    Par défaut
    Le fichier a 14 M

    avec 500 K de ligne

  6. #6
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    c'est du csv ?

  7. #7
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bon, si tu as accès au fichier php.ini tu peux modifier la directive memory_limit et la passer à 32M, voire 96M si tu utilises des bibliothèques qui manipulent des images.

    Si tu n'as pas accès, il te reste le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ini_set('memory_limit', '16M');
    à placer au début de ton script.

    Enfin, il faut te conformer au max autorisé par ton hébergeur.
    Chez certains tu peux jouer sur la mémoire avec la directive
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    php_value memory_limit 16M
    à placer dans le .htaccess

    Ensuite, il se peut que tu butes sur le temps limite d'exécution d'un script, pour cela il faut jouer avec set_time_limit()

  8. #8
    Membre habitué
    Homme Profil pro
    ray man
    Inscrit en
    Juillet 2009
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : ray man

    Informations forums :
    Inscription : Juillet 2009
    Messages : 274
    Points : 130
    Points
    130
    Par défaut
    la je travail en local et j'ai sa dans mon php.ini
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    memory_limit = 128M
    et sa ne marche pas toujours

  9. #9
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Ah oui si avec 128M ça ne passe toujours pas, il faudrait dire ce que contient ton fichier et ce que tu en fais avec ta routine de parsage pour essayer de voir si une autre approche permettrait de le digérer.

  10. #10
    Membre actif Avatar de hazamor
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2008
    Messages : 179
    Points : 206
    Points
    206
    Par défaut
    Vous pouvez utiliser fopen et fgets pour lire le contenu de fichier et des boucles pour tester:
    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
    21
    22
    23
     
    set_time_limit(1000);
    $fichier = "test.txt";
     
    $handle = @fopen($fichier, "r");
    if ($handle) {
       while (!feof($handle)) {
           $lines[] = fgets($handle, 4096);
       }
       fclose($handle); 
    }
     
    $resultat=array();
    foreach ($lines as $ln){
        if (!in_array($ln, $resultat))
        {
            $resultat[]=$lines[$key];
        }
    }
     
    foreach ($resultat as $ln){
        echo '<br>'.$ln;
    }
    J'ai l'essayé avec un fichier de 50 M, ça fonctionne mais il a pris quelques minutes!

  11. #11
    Membre habitué
    Homme Profil pro
    ray man
    Inscrit en
    Juillet 2009
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : ray man

    Informations forums :
    Inscription : Juillet 2009
    Messages : 274
    Points : 130
    Points
    130
    Par défaut
    Merci pour vos repense mais j'ai pris la solution suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ini_set('memory_limit', '5500M');
    sa marche en local et chez mon hébergeur


    Cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème pour lire dans un tableau ...
    Par themis dans le forum Oracle
    Réponses: 1
    Dernier message: 15/02/2006, 18h04
  2. Problème d'affichage dans un tableau
    Par claralavraie dans le forum ASP
    Réponses: 13
    Dernier message: 21/12/2005, 15h45
  3. Réponses: 2
    Dernier message: 19/12/2005, 12h23
  4. [débutant]problèmes d'affichage dans un tableau
    Par Hastur dans le forum Balisage (X)HTML et validation W3C
    Réponses: 12
    Dernier message: 16/08/2005, 12h00
  5. Problème d'écriture dans un tableau
    Par Hokagge dans le forum MFC
    Réponses: 46
    Dernier message: 08/07/2005, 16h47

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