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 :

Traitement de gros fichier CSV [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 102
    Points : 77
    Points
    77
    Par défaut Traitement de gros fichier CSV
    Bonjour,

    je ne suis pas sûr d'être au bon endroit, car je ne sais pas si PHP est bien adapté a ce que je veux faire.

    Le principe est simple, insérer le contenu d'un fichier CSV dans une base de donnée. Mon script fonctionne très bien pour des fichiers inférieur à 1Mo. mais le problème et que je dois traiter un fichier de 100Mo.

    J'ai poussé la limite de temps de PHP à 1h, mais au bout de ce temps, je n'ai parcouru que 6% de mon fichier.

    Ma question est donc : comment optimser tout ca ? est-ce qu'il faut que j'utilise un autre langage.. si oui, lequel ?

    Voici mon code:
    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
     
     
    $sSqlInsert="";
    $sNomTable="matable";
     
    //vide la table
    $sSql="DELETE FROM ".$sNomTable."";
    mysql_query($sSql);
    $fpHandle = fopen($sNomFichier, "r");	
    while (($aData = fgetcsv($fpHandle, 1000, ";")) !== false) {		
    	$nNbVal = count($aData);	
     
    	if($aData[($nNbVal-1)]==""){				
    		array_pop($aData);		
    		$nNbVal = count($aData);
    	}	
    //insertion d'une nouvelle ligne
    	$sSqlInsert.="INSERT into ".$sNomTable." VALUES('','".date("Y-m-d H:i:s")."','".date("Y-m-d H:i:s")."'";
    	for ($i=0; $i <  $nNbVal; $i++) {
    		$sSqlInsert.= ",'".addslashes($aData[$i])."'";
    	}
    	$sSqlInsert.=");";			
    }
    mysql_query($sSqlInsert);
    fclose($fpHandle);

  2. #2
    Expert éminent sénior

    Avatar de Deepin
    Homme Profil pro
    Ingénieur - Chef de projet Modélisation/Simulation
    Inscrit en
    Avril 2004
    Messages
    3 164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afrique Du Sud

    Informations professionnelles :
    Activité : Ingénieur - Chef de projet Modélisation/Simulation
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 164
    Points : 51 095
    Points
    51 095
    Par défaut
    Salut,
    ce que tu peux faire c'est decouper ton fichier en plusieurs petits fichiers.
    voici un exemple de solution:
    http://blog.thinkphp.de/archives/131...thout-PHP.html
    A++ et bon courage

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 102
    Points : 77
    Points
    77
    Par défaut
    Salut,

    merci pour ta réponse.

    L'idée serait en fait d'etre plus rapide. Le détail que je n'ai pas précisé et que ce fichier va etre mis à jour tous les jours. Il faut donc que je traite l'ensemble de ces données le plus rapidement possible (fichier découper ou pas). Est-ce que découper le fichier me fera gagner du temps ?

    Merci

  4. #4
    Membre éclairé
    Avatar de gerald2545
    Profil pro
    Inscrit en
    Février 2003
    Messages
    744
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 744
    Points : 773
    Points
    773
    Par défaut
    il faut faire des tests mais si tu le découpes, tu peux du coup paralléliser ton traitement....donc au final tu devrais être gagnant

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 102
    Points : 77
    Points
    77
    Par défaut
    Bien vu, je test ca et je vous tiens au courant.

    Merci bocoup.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 102
    Points : 77
    Points
    77
    Par défaut
    Bon j'ai testé, je peux effectivement découpé mon fichier. Donc ca devrait être fesable comme ca.

    Comment lancer plusieur script PHP en parallelle sans navigateur ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    traitementFichier("monfichier1");
    traitementFichier("monfichier2");
    traitementFichier("monfichier3");
    Je pense qu'en fesant cela la fonction de la ligne 2 n'est pas exécutées tant que la fonction de la ligne 1 n'est pas terminé. Est-ce exacte ?

    Merci d'avance

    PS: Coment déplacer cette discussion qui n'est plus du tout a sa place (je n'ai finalement pas de problème avec la base de données)

  7. #7
    Membre averti Avatar de max44410
    Étudiant
    Inscrit en
    Juin 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2003
    Messages : 426
    Points : 301
    Points
    301
    Par défaut
    je ne suis pas sur que tu vas gagner du temps en lancant plusieurs scripts en parallele. Je ne sais pas si apache peu exploiter le multi processeurs ou multithreading, je sais qu'il peut faire du loadbalancing mais a part ca ... bref pour resumer si tu n'as pas de serveur multi processeurs je ne pense pas que ca ira plus vite en lancant les scripts en parallele...

    il faudrait peut etre se pencher sur le language PERL qui est très rapide, enfin plus rapide que PHP.

    Voila c'etait juste mon point de vue.

    Bonne chance...

  8. #8
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Points : 1 357
    Points
    1 357
    Par défaut
    Bonjour,

    Essaies avec ça :
    http://dev.mysql.com/doc/refman/5.0/fr/load-data.html

    C'est extrêmement rapide.

  9. #9
    Membre averti Avatar de max44410
    Étudiant
    Inscrit en
    Juin 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2003
    Messages : 426
    Points : 301
    Points
    301
    Par défaut
    Citation Envoyé par jeca
    Bonjour,

    Essaies avec ça :
    http://dev.mysql.com/doc/refman/5.0/fr/load-data.html

    C'est extrêmement rapide.
    Ca m'a l'air sympa ca ...
    par contre je crois que cette fonction n'existe qu'à partir de MySQL 5.0
    A voir si tu as cette version...

  10. #10
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Points : 1 357
    Points
    1 357
    Par défaut
    Existe déjà dans la version que j'utilise : 4.1.9-max

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 102
    Points : 77
    Points
    77
    Par défaut
    je vais regarder ca ... et continuer mes questions dans le forum Perl.

    Merci

  12. #12
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Par rapport à votre code d'origine : la fonction mysql_query n'est pas prévue pour exécuter plus d'une requête. Ceci est clairement mentionné dans sa documentation. L'extension mysqli propose, elle, une fonction (ou méthode) à cette fin (mysqli_multi_query).

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

Discussions similaires

  1. Très gros fichier CSV
    Par kidathom dans le forum Débuter
    Réponses: 6
    Dernier message: 29/04/2008, 13h00
  2. Réponses: 5
    Dernier message: 13/02/2008, 10h22
  3. [CSV] Traitement d'un gros fichier CSV
    Par Adrinou dans le forum Langage
    Réponses: 6
    Dernier message: 09/10/2007, 12h40
  4. Traitement de gros fichiers
    Par Seth77 dans le forum Langage
    Réponses: 2
    Dernier message: 27/06/2006, 15h53
  5. [C#] [XML] Traitement de gros fichiers XML (90 Mo)
    Par Pulsahr dans le forum Windows Forms
    Réponses: 20
    Dernier message: 01/12/2005, 14h40

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