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 :

Insertion par batch en php


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé Avatar de Jacobian
    Inscrit en
    Février 2008
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 425
    Par défaut Insertion par batch en php
    Bonjour tous le monde,
    je cherche des retours d'experience concernant les batches PHP
    voici mon probleme:
    j'ai 300M de fichier sql chaque fichier contient des insertions dans 3 tables:
    - country
    - city
    - region

    pour cela, je veux optimiser mon programme suivant:

    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
     
    foreach ($sel_country as $id_country => $name_country){
    	foreach ($country[$id_country]['part'] as $part_number => $part_country){
    					//path to sql file
    					$db_file = "/".$part_country.".sql";
    					$f_sql = fopen($db_file,"r");
    					while (!feof($f_sql)) {
    						$strSQL = fgets($f_sql);           		
    						//insert data
    					          $model->executeQuery($strSQL))					
    					}
    					//close the file
    					fclose($f_sql);
    			}
    		}
    conteneu des fichiers:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    INSERT INTO  country (id, name, id_country) VALUES (1,'Afghanistan',0)
    INSERT INTO  region (id, id_country, name) VALUES (1,1,'Velayat-e Badakhshan')
    INSERT INTO  city (id, id_country, name, zip_code, region_code, id_region, lat, lon) VALUES (1,1,'Ab Gach','','',1,36.9833332,72.7000000)
    .......

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Si le SGBD supporte les transactions, c.a.d en gros si ce n'est pas mysql avec le moteur MyISAM, il faudrait grouper les INSERT dans une transaction. Une transaction par fichier SQL, par exemple, ça serait assez simple au vu du découpage.

    Dans le cas contraire à chaque INSERT, le SGBD attend que les données soient bien physiquement sur disque avant de continuer, ce qui ralentit énormément.

  3. #3
    Membre éclairé Avatar de Jacobian
    Inscrit en
    Février 2008
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 425
    Par défaut
    oui j'ai bien mySql avec le moteur myISam,
    comment faire pour englober un fichier par transaction ?

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Avec MyISAM ce n'est pas faisable ni nécessaire car ce moteur n'a pas de transaction.

    Pour aller plus vite il aurait fallu que les données soient au format brut au lieu d'être déjà en insert SQL, et les importer avec la commande LOAD DATA ou le programme mysqlimport qui sont spécialement prévus pour l'import de données en masse.

    Une autre option serait en principe de traiter plusieurs fichiers en parallèle, mais avec MyISAM ça risque de ne rien donner comme accélération puisque que lors d'un INSERT le moteur verrouille toute la table.

    Bref, rien de positif :-(

  5. #5
    Membre éclairé Avatar de Jacobian
    Inscrit en
    Février 2008
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 425
    Par défaut
    ok je vais changer en InnoDB,
    est ce qu'il faut aussi changer le format des fichier insert ??

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Les INSERTs ont l'air complètement standard, il ne devrait pas y avoir de problème avec.

    En revanche j'ai oublié quelque chose précédemment: s'il y a des index sur les tables, il est bon pour le temps d'exécution de les supprimer, pour les recréer une fois que l'import est terminé.
    Et c'est encore plus vrai pour une insertion en parallèle s'il y a des index uniques.

  7. #7
    Membre éclairé Avatar de Jacobian
    Inscrit en
    Février 2008
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 425
    Par défaut
    le soucis avec load data infile est qu'il permet pas l'import dans plusieurs table est c'est ça que j'aime pas,
    d'autre proposition ?

  8. #8
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    y'a jamais de saut ligne dans tes insères ?

  9. #9
    Membre éclairé Avatar de Jacobian
    Inscrit en
    Février 2008
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 425
    Par défaut
    si j'ai bien compris non j'ai pas de saut de ligne dans mes fichiers mes par contre j'ai retour a la ligne

  10. #10
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Citation Envoyé par Jacobian Voir le message
    ok je vais changer en InnoDB,
    est ce qu'il faut aussi changer le format des fichier insert ??
    Hey, ne va pas changer le moteur de stockage juste parce que c'est plus pratique. Il faut un raison technique valide pour faire ça.

  11. #11
    Membre éclairé Avatar de Jacobian
    Inscrit en
    Février 2008
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 425
    Par défaut
    Hey, ne va pas changer le moteur de stockage juste parce que c'est plus pratique. Il faut un raison technique valide pour faire ça.
    je suis prêt a faire une refonte de tous le system si la solution que vous me proposer va amélioré les performance.

    jusqu'a présent j'ai pas une réponse claire et pointue

  12. #12
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Le choix du moteur de stockage va dépendre de plusieurs paramètres: le volume de données à stocker, la présence de clés étrangères, le temps d'accès etc.

    Généralement, et sauf motivation particulière, on mets les tables en InnoDB pour avoir:
    - le renforcement de sécurité sur les clés étrangères
    - les dépendances et les modifications en cascade
    - les transactions
    En revanche, si ta table contiens un nombre très important de donnés (supérieur à plusieurs millions de tuples) il vaut mieux mettre du MyIsam sinon la taille en mémoire va exploser avec les index. Egalement, si tu cherches à faire des recherches fulltext, seul MyIsam possède l'index qui te permet de le faire.

    Renseigne toi plus sur le site de MySQL pour déterminer le moteur qu'il te faut: http://dev.mysql.com/doc/refman/5.0/...e-engines.html, http://www.mysql.fr/why-mysql/white-...sam_innodb.php

  13. #13
    Membre éclairé Avatar de Jacobian
    Inscrit en
    Février 2008
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 425
    Par défaut
    j'ai fait un test si j'ai met:

    - MyIsam le temps d’exécution il est entre 20 et 30 min
    - si je met innoDb le temps est doublé en 2 à savoir plus que 40 min

    donc pour ses table la j'adopte comme moteur myIsam, cela dit j'aimerais bien des idées sur comment optimisé mon code au début

  14. #14
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    y'a quoi derrière le executeQuery ?

  15. #15
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Citation Envoyé par Jacobian Voir le message
    j'ai fait un test si j'ai met:

    - MyIsam le temps d’exécution il est entre 20 et 30 min
    - si je met innoDb le temps est doublé en 2 à savoir plus que 40 min

    donc pour ses table la j'adopte comme moteur myIsam, cela dit j'aimerais bien des idées sur comment optimisé mon code au début
    Y'a juste un truc que j'ai pas tellement compris, cette action tu dois l'effectuer souvent ?

    Si c'est une action que tu dois effectuer une fois de temps en temps, le temps d'import export importe moins que la rapidité des requêtes effectuées par le système sur ces tables...

    Egalement, si tu as un fichier de données (volumineux certes) tu peux l'importer dans un base de données en utilisant la console:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql -u xxx -p yyy database < fichier.sql

  16. #16
    Membre éclairé Avatar de Jacobian
    Inscrit en
    Février 2008
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 425
    Par défaut
    - executeQuery comme sont nom l'indique il lance une requête sql
    - en fait c'est un system qui offre aux utilisateurs un ensemble de pays qu'il veux installer comme il peux les réinstallé
    si l’utilisateur clic sur check All alors la il faut attendre

  17. #17
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    Citation Envoyé par Jacobian Voir le message
    - executeQuery comme sont nom l'indique il lance une requête sql
    je m'en doutais pas du-tout ...
    montre le code, on ne sait pas ce que t'as mis dedans

  18. #18
    Membre éclairé Avatar de Jacobian
    Inscrit en
    Février 2008
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 425
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public function executeQuery($query)
    	{
    		$db = JFactory::getDBO();
    		$db->setQuery($query);
     
    		if (!$db->Query()) {
    			return false;
    		}
     
    		return true;
    	}

  19. #19
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    arf c'est du Joomla, je comprend mieux

  20. #20
    Membre éclairé Avatar de Jacobian
    Inscrit en
    Février 2008
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 425
    Par défaut
    non ce n'est pas de joomla mais c'est du PHP

    j'attend vos lumieres les gas?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [MySQL] erreur lors de l'insertion d'une valeur obtenue par la fonction php mysql_insert_id() !
    Par mourad_betelgeuse dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 04/05/2013, 20h26
  2. Réponses: 1
    Dernier message: 07/11/2007, 18h51
  3. insertions par lots
    Par boubilescu dans le forum Access
    Réponses: 1
    Dernier message: 04/11/2005, 10h32
  4. [Système] récupérer l'HTML généré par ma page PHP
    Par saint-pere dans le forum Langage
    Réponses: 2
    Dernier message: 27/09/2005, 10h19
  5. Probléme d'insertion par défault
    Par xavier62 dans le forum SQL
    Réponses: 7
    Dernier message: 28/11/2003, 13h03

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