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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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.

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

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