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 :

Timeout avec fonction array_unique, comment l'optimiser ?


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 284
    Par défaut Timeout avec fonction array_unique, comment l'optimiser ?
    Bonjour,

    J'ai un fichier à plat, avec 5000 occurrences séparées par le symbole # avec des doublons.

    Ex : toto#titi#titi#tata#titi#toto#tata#tutu#titi#toto#toto
    Pour supprimer les doublons j'utilise la fonction : array_unique.

    Cependant j’obtiens un timeout à 30s car le fichier est trop gros.

    Savez vous comment faire pour optimiser le code pour que je parse le fichier sans timeout ?

    Merci d'avance.

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    	//Ouverture du fichier en lecture seule
    	$filename = './data/team.txt';
    	$resultat = fopen($filename, 'r');
     
    	//Si on a réussi à ouvrir le fichier
    	if ($resultat)
    	{
    		//Tant que l'on est pas à la fin du fichier
    		while (!feof($resultat))
    		{
    			$compteur++;
     
    			//On lit la ligne courante
    			$line= fgets($resultat);
     
    			$recherche= explode("#", $line);
     
    			$selected = ''; 
     
     
    			foreach($recherche AS $cle => $valeur)
    			{
     
    				$uniqueArray = array_unique($recherche, SORT_REGULAR);
     
    			}
     
    		}
    		//On ferme le fichier
    		fclose($resultat);
    	}

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    Billets dans le blog
    12
    Par défaut
    Salut,

    euh... c'est étrange ton code !!
    Je procéderais autrement :
    1. tu parcours ton fichier et tu récupères dans un tableau les données et à la fin tu fais un seul et unique array_unique($data);
    2. ou tu insères tes données comme clés d'un tableau résultat car les clés d'un tableau sont forcément uniques :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      $row   = explode('#', $line);
      $data += array_flip($row);


    A tout hasard, je te conseille de lire un peu la doc sur les opérateurs de tableaux (pour la somme de deux tableaux)

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2012
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2012
    Messages : 284
    Par défaut
    C'est top merci

    Comme les clés sont uniques avec array_flip pas besoin de array_unique

    Je me trompe ?

    En tout cas comme ca j'ai le résultat attendu sans les doublons.

    Merci !!!!!!!!

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
     <?php
     
     $data = '';
     $valeur = '';
     
     //Ouverture du fichier en lecture seule
     
    $compteur = 0;
     
    	$filename = '../data/team.txt';
    	$resultat = fopen($filename, 'r');
     
    	//Si on a réussi à ouvrir le fichier
    	if ($resultat)
    	{
     
    			//On lit la ligne courante
    			$line= fgets($resultat);
     
    			$rows = explode('#', $line);
     
    			//Test enreg 1
    			//echo $rows[1];
    			$datas = array_flip($rows);	
     
    			//print_r($datas);
     
    		//On ferme le fichier
    		fclose($resultat);
     
    		//echo $data[1];
     
    	}
     
    					foreach($datas  AS $data => $valeur)
    			{
    				If ($valeur != "")
    				{
     
    				  echo $data.'--->' .$valeur.'<br />';
    				  //$data .= $valeur;
    					//$data += array_flip($row);
    				}	
     
    			}
     
    ?>

  4. #4
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    Billets dans le blog
    12
    Par défaut
    Tu peux encore simplifier : si ton fichier est au format csv, tu as une fonction qui fait tout pour toi : fgetcsv()

    Dans ton cas, effectivement array_flip() te dispense de array_unique().
    Ensuite si tu veux récupérer un tableau des plus classiques, tu fais un array_keys() sur ton tableau à clés uniques.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/03/2015, 17h33
  2. [XL-2010] Boucle surchargée avec multiples insertions de formules : comment l'optimiser ?
    Par Thierry360 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 28/02/2013, 14h11
  3. Optimisation d'une requete avec fonction Max
    Par ghargamaster dans le forum Langage SQL
    Réponses: 13
    Dernier message: 28/02/2011, 09h25
  4. Lenteur requête avec 17 LEFT JOIN. Comment l'optimiser?
    Par spitou_77 dans le forum Requêtes
    Réponses: 2
    Dernier message: 09/10/2007, 16h44
  5. [VStudio 6] pb avec fonctions dans une DLL
    Par MogDeChNord dans le forum MFC
    Réponses: 8
    Dernier message: 08/01/2004, 08h57

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