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

PHP & Base de données Discussion :

Table de données volumineuse


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Points : 460
    Points
    460
    Par défaut Table de données volumineuse
    Bonjour,
    J'ai un script qui communique avec une table. En local, la table avec 1000 entrées tout roule bien. En production en ligne, la table renferme environ 200 000 entrées, du coup le script plante.
    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
     
    //Array des census
    function getCensus() {
    	global $db;
    	$sql = 'SELECT a.idagent as agent_id, a.nom as nom, a.prenom as prenom, a.sexe as sexe, a.matricule as matricule, a.telephone as tel, a.email as email, c.libellecorps as corps, c1.libellecadre as cadre, p.libelleposte as poste, r1.libellerang as rang, r.date_affectation as date_affectation, r.validation as validation, r.administration as administration, r.service as service, r.structure as structure, r.region as region, r.dpt as dpt, r.arr as arr FROM recensement r 
    				INNER JOIN agents a ON a.idagent = r.agent
    				INNER JOIN corps c ON c.idcorps = r.corps
    				INNER JOIN cadres c1 ON c1.idcadre = r.cadre
    				INNER JOIN postes p ON p.idposte = r.poste
    				INNER JOIN rangs r1 ON r1.idrang = r.rang';
    	$statement = $db->prepare($sql);
    	$statement->execute();
    	$tabl_results = $statement->fetchAll();	
    	return $tabl_results;
    }
     
    //Appel de la fonction
    $arrayCensus = getCensus();
    Avec $arrayCensus je fais des traitements divers par exemple regrouper des census de sexe masculin et féminin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    $arrayCensusMan = array();
    $arrayCensusWoman = array();
    foreach ($arrayCensus as $census) {
    	if ( $census['sexe'] == 1 ) {
    		array_push($arrayCensusMan, $census);
    	}
    	else {
    		array_push($arrayCensusWoman, $census);
    	}
    }
    //Affichage
    echo count($arrayCensusMan);//les hommes
    echo count($arrayCensusWoman);//les femmes
    Ce n'est que un exemple de traitement j'en fais plusieurs autres pour faire des
    états à base de cet array initial. Chaque traitement me retourne un array et je fais un count() pour retourner le nombre d'items. Du coup la page page plante.

    Quelqu'un pourrait me venir en aide résoudre ce dilemme ?

    Merci d'avance...

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 086
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 086
    Points : 8 174
    Points
    8 174
    Billets dans le blog
    17
    Par défaut
    Quand est-ce que ça plante exactement ?
    Quel est le msg d'erreur ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tabl_results = $statement->fetchAll();
    Si ta requête retourne 200 000 lignes pesant chacune 300 octets alors le tableau $tabl_results pèsera à lui seul 200 000 * 300 = ~60 mégaoctets. Il va probablement falloir être moins gourmand.

    Essaie de restreindre les résultats au maximum, de n'extraire que le strict nécessaire au traitement.
    Essaie de faire faire les traitements par MySQL (procédures stockées).
    Au pire traite tes données MySQL dans un while qui parcourera le jeu de résultat sans le stocker entièrement en mémoire.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Membre averti Avatar de Sekigawa
    Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    432
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 432
    Points : 359
    Points
    359
    Par défaut
    Quel est exactement le but de votre requête ?

    Un affichage de toutes les lignes ? Si c'est la cas pourquoi ne pas faire un système de pagination ?

    Juste affichage le nombre de ligne ? Si c'est le cas pourquoi ne pas faire une requête avec un count ?

    A+
    Cookie : Anciennement petit gâteau sucré, qu'on acceptait avec plaisir. Aujourd'hui : petit fichier informatique drôlement salé, qu'il faut refuser avec véhémence.

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Points : 460
    Points
    460
    Par défaut
    Citation Envoyé par Séb. Voir le message
    Essaie de faire les traitements par MySQL (procédures stockées).
    Bonne idée.
    C'est quoi les procédures stockées et à quoi elles peuvent bien être utiles ?

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Points : 460
    Points
    460
    Par défaut
    Citation Envoyé par Sekigawa Voir le message
    Quel est exactement le but de votre requête ?

    Un affichage de toutes les lignes ? Si c'est la cas pourquoi ne pas faire un système de pagination ?

    Juste affichage le nombre de ligne ? Si c'est le cas pourquoi ne pas faire une requête avec un count ?

    A+
    Des bonnes pistes. Merci.

  6. #6
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 086
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 086
    Points : 8 174
    Points
    8 174
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par okoweb Voir le message
    C'est quoi les procédures stockées
    Ce sont, en quelque sorte, des fonctions traitant directement les données de la base de données.
    Un de leurs avantages : pour les gros volumes de données elles évitent le transit client PHP / serveur MySQL.
    http://dev.mysql.com/doc/refman/5.0/...rocedures.html

    et à quoi elles peuvent bien être utiles ?
    Faudrait répondre aux questions posées.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Chaque traitement me retourne un array et je fais un count() pour retourner le nombre d'items.
    Ceci sera beaucoup plus rapide et prendra moins de ressources :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT sexe, COUNT(*) AS Nombre
    FROM recensement
    GROUP BY sexe
    Le SGBD sera toujours plus rapide que le PHP pour faire du traitement massif de données, c'est son boulot !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. [Python 2.X] ajouter des données volumineuse dans une table oracle
    Par bernards111 dans le forum Général Python
    Réponses: 2
    Dernier message: 09/10/2014, 15h55
  2. Réponses: 2
    Dernier message: 11/01/2006, 11h54
  3. Tables avec données temporelles
    Par blins dans le forum Oracle
    Réponses: 12
    Dernier message: 12/12/2005, 09h50
  4. Réponses: 9
    Dernier message: 07/10/2004, 19h41
  5. [QuickReport] Données d'une table et données calculées
    Par poufouille dans le forum Bases de données
    Réponses: 11
    Dernier message: 30/03/2004, 16h01

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