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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 102
    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
    Membre chevronné

    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
    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 confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 102
    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 émérite
    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
    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 confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Merci bocoup.

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 102
    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)

+ 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