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

Windows Forms Discussion :

temps insertion fichier texte trop long


Sujet :

Windows Forms

Vue hybride

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

    Informations forums :
    Inscription : Décembre 2009
    Messages : 89
    Par défaut temps insertion fichier texte trop long
    Bonjour,

    Je développe une application VB avec visual studio qui me permet d'inserer des données brut provenant de fichiers texte dans une BDD sql Server 2005 version express.

    Un répertoire (qui fait en moyenne 2.5 à 3 Mo) represente une semaine et contient à peu pres 80 fichiers textes et chaque fichier contient pas loin de 1000 lignes donc pour une semaine j'insere dans ma table ligneTransaction pas loin de 80 000 lignes.

    Pour chaque ligne j'ai une routine qui la decoupe (avec un split) et je fais des test et des conversion avant d'appeler ma procedure stockée.

    Dans ma procédure stockée je fais un test pour savoir si cette ligne existe, je reupere des clef etrangeres et ensuite je l'insere.

    Quand j'utilise mon application et que je souhaite integrer une semaine le temps d'insertion augmente, pour la premiere semaine je met 6 minutes et quand j'arrive à la quatrième semaine je met pas loin de 41 minutes .

    C'est beaucoup vous ne trouvez pas ? D'autant que dans une année il y a 53 semaine !!!

    Je travaille en local sur un poste windows xp 3.48 Go de ram Pentium Dual Core 2.6 GHz avec visual studio 2008 et sql server 2005 express.

    Est ce que le temps d'execution vous semble normal ?

    Pouvez me donner un tuyau pour diminuer le temps de traitement c'est tres important et ca fait une semaine que je bloque !!

    Merci d'avance !!!

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 319
    Par défaut
    Bonjour
    Euh non c'est pas long, c'est beaucoup trop long , je sais que je met environ 30sec pour 35k lignes dans ma bdd sous sql server 2005.
    Peut on voir le code qui permet l'insertion dans la bdd?
    Tu fais ca dans un thread a part ou directement dans ton thread principal?
    Cordialement
    Nasty

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 89
    Par défaut
    je pense que je fais ca dans mon thread principal je ne sais pas trop en fait !!

    Voici mon code je ne sais pas si ca sera lisible c'est la premiere fois que post du 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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    Public Function integrerLigne(ByVal maligne As String, ByVal pointVente As String)
     
            Dim continuLigne As Boolean = True
     
            Dim codeErreur As Int16
            Dim ElementBis() As String = maligne.Split(";")
            Dim v As Char = ","
            Dim p As Char = "."
            Dim sBis As String       
            Dim d1 As DateTime = New DateTime()
            Dim i As Int16
     
            Try
                    If (ElementBis(3).Equals("V") = True) Then
     
                    If (ElementBis(6).Contains(p)) Then
                        sBis = ElementBis(6).Replace(p, v)
                    Else
                        sBis = ElementBis(6)
     
                    End If
     
                    i = CInt(ElementBis(0))
                    Dim d As String = ElementBis(1)
                    Dim h As String = ElementBis(2).Substring(4, 4).Insert(2, ":")
     
     
                    Dim dh As String = d + " " + h
                    d1 = DateTime.Parse(dh)
     
                bd.preparePs("dbo.test")
                bd.addParam("@IdMachine", ParameterDirection.Input, DbType.Int16)
                bd.fixerValeur("@IdMachine", i)
                bd.addParam("@codeUNI", ParameterDirection.Input, DbType.String)
                bd.fixerValeur("@codeUNI", pointVente)
                bd.addParam("@date", ParameterDirection.Input, DbType.DateTime)
                bd.fixerValeur("@date", d1)
                bd.addParam("@decision", ParameterDirection.Input, DbType.String)
                bd.fixerValeur("@decision", ElementBis(3))
                bd.addParam("@codeModePaiement",ParameterDirection.Input,         DbType.String)
                bd.fixerValeur("@codeModePaiement", ElementBis(4))
                bd.addParam("@nbTransaction", ParameterDirection.Input, DbType.Int16)
                    bd.fixerValeur("@nbTransaction", Int16.Parse(ElementBis(5)))
                    bd.addParam("@somme", ParameterDirection.Input, DbType.Decimal)
                    bd.fixerValeur("@somme", Decimal.Parse(sBis))
     
                    codeErreur = bd.executer()
     
                    continuLigne = True
     
                    If (codeErreur = 2) Then
                        continuLigne = False
                    End If
     
     
                End If
     
                Return continuLigne
     
            Catch ex As Exception
                MsgBox("ligne non valide" + bd.getLib + "  " + pointVente + " " + i.ToString + " " + d1.ToString + " " + sBis)
            End Try
     
     
        End Function

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2009
    Messages : 80
    Par défaut
    Bonjour,

    Selon moi c'est pas le traitement dans VB pour le split des lignes qui pose problème, ce doit être au niveau SQL que tu as le ralentissement.

    Je pense qu'une procédure stocké a beaucoup d'avantage dans certains cas mais selon mois dans ton cas tu devrait plutôt faire tes inserts avec un Query en direct dans la base. Actuellement la procédure tourne pour chaque ligne.
    Essai d'envoyer plusieurs enregistrement dans la même requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO Table (champ1,champ2,etc...) VALUES (Champ1,champ2,etc)(champ1,champ2,etc)
    Le temps de traitement SQL sera beaucoup plus rapide

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 319
    Par défaut
    C'est une possibilité.
    Pour faire mes insertions massives j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    bulk insert elect_test_yln.dbo.FICHE
    from 'C:\Documents and Settings\YLN\fiche.txt'
    with 
    (
    datafiletype = 'widechar',
    fieldterminator = ';',
    rowterminator = '\n',
    firstrow = 1
    );
    tu a juste a faire le traitement dans chacun de tes fichiers pour mettre les "," et autres séparateurs, ce qui doit être gérable niveau code (j'ai pas encore essayé mais ca doit être trouvable)
    Mais je ne promet rien
    Cordialement
    Nasty

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    executer une requete par ligne c'est ca qui prend du temps

    utilise le bulk insert pour qu'sql server aille directement piocher les données dans les fichiers et ca devrait etre relativement plus instantanné
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 319
    Par défaut
    Merci Pol63 de confirmer
    Mais ca ne sera toujours pas "instantané", il y aura toujours le temps de traitement pour mettre les fichiers textes en forme et ca peut être assez long des fois! Mais ca sera toujours moins que tes 40minutes
    Cordialement
    Nasty

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 89
    Par défaut
    Pour bobo :
    Actuellement la procédure tourne pour chaque ligne.
    80000 lignes = 80000 appel de procedure sotckees !!

    Tu me conseille donc d'utiliser un query c ca et non passer par une procedure sotckee ?

    Pour Nasty :

    apres bulk insert tu met quoi le nom de la table ?
    Est ce que je peux utiliser le multithreading si oui tu peux m'en dire plus ?

    Merci beaucoup pour votre aide !!

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 89
    Par défaut
    J'essaie de creer un trigger instead of insert, je ne connais pas trop donc soyez indulgent qui me permettra de concatener l'heure et la date.

    Dans mon fichier texte j'ai rassembler l'heure et la date ils ne sont plus separe par un ";" mais par un espace.

    Est ce que ca pourrait marcher

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE TRIGGER inser on ligne
    instead of insert
    as 
    begin
    	insert into ligne values(inserted.IdMachine,convert(inserted.dateTransaction,smalldatetime),inserted.decision,inserted.codeModePaiement,inserted.nbDossiers,inserted.sommeTransaction)
    end;
    Erreur :

    Msg*128, Niveau*15, État*1, Procédure*inser, Ligne*5
    Le nom "inserted.IdMachine" n'est pas autorisé dans ce contexte. Les expressions valides sont des constantes, des expressions constantes et (dans certains contextes) des variables. Les noms de colonnes ne sont pas autorisés.

    Cordialement.

  10. #10
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    non
    le premier à priori faut qu'on a sur les triggers c'est qu'inserted est une ligne, hors ca peut en etre plusieurs d'un coup, donc le values n'est pas utilisable

    m'enfin si tu as réuni dans le fichier texte la date et l'heure il n'y a pas besoin de trigger je pense
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 89
    Par défaut
    oui je les ai reuni

    avant
    0001;2008-12-29;00001041;V;CB;1;73.10
    apres
    0001;2008-12-29 10:41;V;CB;1;73.10
    mais quand j'essaie de les inserer dans dateTransaction de la table ligneTransaction j'ai des erreurs :

    Msg*4864, Niveau*16, État*1, Ligne*1
    Erreur de conversion des données à charger en bloc (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 1, colonne 2 (dateTransaction).
    Msg*4864, Niveau*16, État*1, Ligne*1
    Erreur de conversion des données à charger en bloc (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 2, colonne 2 (dateTransaction).
    Msg*4864, Niveau*16, État*1, Ligne*1
    Erreur de conversion des données à charger en bloc (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 3, colonne 2 (dateTransaction).
    Msg*4864, Niveau*16, État*1, Ligne*1
    Erreur de conversion des données à charger en bloc (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 4, colonne 2 (dateTransaction).
    Msg*4864, Niveau*16, État*1, Ligne*1
    Erreur de conversion des données à charger en bloc (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 5, colonne 2 (dateTransaction).
    Msg*4864, Niveau*16, État*1, Ligne*1
    Erreur de conversion des données à charger en bloc (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 6, colonne 2 (dateTransaction).
    Msg*4864, Niveau*16, État*1, Ligne*1
    Erreur de conversion des données à charger en bloc (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 7, colonne 2 (dateTransaction).
    Msg*4864, Niveau*16, État*1, Ligne*1
    Erreur de conversion des données à charger en bloc (incompatibilité de type ou caractère non valide pour la page de codes spécifiée) pour la ligne 8, colonne 2 (dateTransaction).

Discussions similaires

  1. [VB6]Message d'erreur si le temps d'exécution est trop long
    Par Asdorve dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 14/09/2006, 16h43
  2. Réponses: 2
    Dernier message: 29/08/2006, 16h18
  3. textbox et onKeyUp event -> largeur augmente auto quand texte trop long
    Par Miketrix dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 25/07/2006, 11h14
  4. [FLASH8] Insertion fichier texte et fleches
    Par BrItneY dans le forum Flash
    Réponses: 8
    Dernier message: 27/06/2006, 13h46
  5. Fichier texte trop gros pour etre ouvert
    Par tavman dans le forum C++
    Réponses: 5
    Dernier message: 05/10/2005, 00h07

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