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

VB.NET Discussion :

Réduire le temps d'un traitement.


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 20
    Points : 12
    Points
    12
    Par défaut Réduire le temps d'un traitement.
    Bonjour,

    Je viens vers vous car j'ai un problème avec un traitement qui est extrêmement long.
    Je demande à l'utilisateur de renseigner des champs qui seront ensuite utilisés pour changer des champs d'un fichier ReportMan. Puis d'imprimer le dit fichier.

    Le fichier est crée avec des valeurs par défauts, l'application le copie et lui donne les valeurs saisies par l'utilisateur.

    Voici la procédure qui me permet de faire la modification de la chaine correspondante :

    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
    Sub ReplaceString(ByVal strFichier, ByVal strOldString, ByVal strNewString)
     
            On Error Resume Next
     
            Dim strTemp = Application.StartupPath & "\File.tmp"
     
            Dim nIn = FreeFile()
            FileOpen(nIn, strFichier, OpenMode.Input)
     
            Dim nOut = FreeFile()
            FileOpen(nOut, strTemp, OpenMode.Output)
     
            Do While Not EOF(nIn)
                Dim strLigne = LineInput(nIn)
                strLigne = Replace(strLigne, strOldString, strNewString)
                PrintLine(nOut, strLigne)
            Loop
     
            FileClose(nOut)
            FileClose(nIn)
     
            FileCopy(strTemp, strFichier)
            Kill(strTemp)
     
        End Sub


    elle est appelé comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ReplaceString(Application.StartupPath & "\Output\" & nomfic & ".rep", "<%item_01%>", MaskedTextBox1.Text)
    ReplaceString(Application.StartupPath & "\Output\" & nomfic & ".rep", "<%prix_01%>", MaskedTextBox2.Text)
    If MaskedTextBox3.Text <> "" Then
            ReplaceString(Application.StartupPath & "\Output\" & nomfic & ".rep", "<%cent_01%>", "." & MaskedTextBox3.Text & "€")
    Else
            ReplaceString(Application.StartupPath & "\Output\" & nomfic & ".rep", "<%cent_01%>", "")
    End If

    Ceci est le traitement sur 1 produit, il le fait en tout sur 16 produits.

    Dans cet exemple <%item_01%> est le champ par défaut du fichier qui doit être remplacer par la valeur du MaskedTextBox1.Text.

    Le temps de traitement pour modifier les 16 produits (nom, euro, centime) correspond à 48 appelle de la procédure (48 champs à changer).

    Cette étape prend environ 13 minutes. C'est beaucoup trop pour l'utilisateur qui veux seulement imprimer son fichier.

    Avez vous une idée pour réduire le temps d'attente ?


    Merci

  2. #2
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Vire le On Error Resume Next (ça existe encore ça ?)

    Aussi, les fichiers font quelle taille ?
    Y'en a beaucoup ?

    L'algo en lui-même m'a l'air tout à fait bon, et ne devrait pas être lent... à moins qu'il soit appelé des centaines de fois en même temps...
    On ne jouit bien que de ce qu’on partage.

  3. #3
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Hmmmm... Au temps pour moi !

    Tu appelles trois fois de suite ce truc pour chaque fiche produit ?

    Pourquoi ne pas passer un "string[] strOld, string[] strNew" en paramètre, et faire une boucle sur les paramètres dans ton sub ?

    Ca évitera de recopier 3 fois de suite ton fichier !

    Aussi, si ton fichier est petit, au lieu de faire le traitement ligne par ligne, tu peux faire un ReadAll plutôt qu'un ReadLine pour charger tous le fichier d'un coup, et faire tes replaces dessus.
    On ne jouit bien que de ce qu’on partage.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Merci pour la réponse !

    Le fichier a une taille d'environ 70 000ko.

    L'idée d'envoyer un tableau me plais bien mais je ne voie pas comment modifier le corps de la procédure...

    Juste dans le DO qu'il faut faire une modif ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Do While Not EOF(nIn)
                Dim strLigne = LineInput(nIn)
                strLigne = Replace(strLigne, strOldString, strNewString)
                PrintLine(nOut, strLigne)
            Loop

    Juste rajouter une ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strLigne = Replace(strLigne, strOldString, strNewString)
    Pour chaque chaine à changer ?

  5. #5
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Dans le do, tu dois boucler sur ton tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for i = lbound(strOldString) to ubound(strOldString)
       strLigne = Replace(strLigne, strOldString(i), strNewString(i))
    next
    On ne jouit bien que de ce qu’on partage.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    J'ai tenter de mettre ceci :

    La procédure :

    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
    Sub ReplaceString(ByVal strFichier, ByVal strOldString, ByVal strNewString)
            On Error Resume Next
     
            Dim strTemp = Application.StartupPath & "\File.tmp"
     
            Dim nIn = FreeFile()
            FileOpen(nIn, strFichier, OpenMode.Input)
     
            Dim nOut = FreeFile()
            FileOpen(nOut, strTemp, OpenMode.Output)
     
            Do While Not EOF(nIn)
                Dim strLigne = LineInput(nIn)
                For i = LBound(strOldString) To UBound(strOldString)
                    strLigne = Replace(strLigne, strOldString(i), strNewString(i))
                Next
                PrintLine(nOut, strLigne)
            Loop
     
            FileClose(nOut)
            FileClose(nIn)
     
            FileCopy(strTemp, strFichier)
            Kill(strTemp)
     
        End Sub


    Et pour tester j'ai mis ceci dans le corps du programme :


    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
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     
     
            If Mode.Text = "Ajout" Then
                Dim strFile = Dir(Application.StartupPath & "\Output\" & txtnom.Text & ".rep")
                Dim nomfic As String
                Dim vérif As Integer
                Dim Montableau1(3) As String
                Dim Montableau2(3) As String
     
                        FileCopy(Application.StartupPath & "\Templates\Template_feuille.rep", Application.StartupPath & "\Output\" & nomfic & ".rep")
                        Montableau1(1) = "<%item_01%>"
                        Montableau1(2) = "<%prix_01%>"
                        Montableau1(3) = "<%cent_01%>"
                        Montableau2(1) = MaskedTextBox1.Text
                        Montableau2(2) = MaskedTextBox2.Text
                        If MaskedTextBox3.Text <> "" Then
                            Montableau2(3) = "." & MaskedTextBox3.Text & "€"
                        Else
                            Montableau2(3) = ""
                        End If
                        ReplaceString(Application.StartupPath & "\Output\" & nomfic & ".rep", Montableau1(3), Montableau2(3))


    Mais juste pour cet exemple (seulement 3 chaines à remplacer) le programme tourne depuis plusieurs minutes... je doit avoir loupé un truc...

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Je viens de tester comme ceci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     Do While Not EOF(nIn)
                MsgBox(5)
                Dim strLigne = LineInput(nIn)
                strLigne = Replace(strLigne, strOldString(1), strNewString(1))
                MsgBox(6)
                strLigne = Replace(strLigne, strOldString(2), strNewString(2))
                MsgBox(7)
                strLigne = Replace(strLigne, strOldString(3), strNewString(3))
                MsgBox(8)
                PrintLine(nOut, strLigne)
                MsgBox(9)
            Loop

    Et il boucle sans fin en passant par toutes les étapes

  8. #8
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Le but du jeu, c'est de lancer une et une seule fois ton StringReplace, en passant en paramètre les deux tableaux entiers.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ReplaceString(Application.StartupPath & "\Output\" & nomfic & ".rep", Montableau1, Montableau2)
    On ne jouit bien que de ce qu’on partage.

  9. #9
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    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
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    Sub ReplaceString(ByVal strFichier, ByVal strOldString, ByVal strNewString)
            Dim i As Integer
            Dim strTemp = Application.StartupPath & "\File.tmp"
     
            Dim nIn = FreeFile()
            FileOpen(nIn, strFichier, OpenMode.Input)
     
            Dim nOut = FreeFile()
            FileOpen(nOut, strTemp, OpenMode.Output)
     
            Do While Not EOF(nIn)
                Dim strLigne = LineInput(nIn)
                For i = LBound(strOldString) To UBound(strOldString)
                    strLigne = Replace(strLigne, strOldString(i), strNewString(i))
                Next
                PrintLine(nOut, strLigne)
            Loop
     
            FileClose(nOut)
            FileClose(nIn)
     
            FileCopy(strTemp, strFichier)
            Kill(strTemp)
    End Sub
    Puis :
    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
     
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     
     
            If Mode.Text = "Ajout" Then
                Dim strFile = Dir(Application.StartupPath & "\Output\" & txtnom.Text & ".rep")
                Dim nomfic As String
                Dim vérif As Integer
                Dim Montableau1(3) As String
                Dim Montableau2(3) As String
     
                        FileCopy(Application.StartupPath & "\Templates\Template_feuille.rep", Application.StartupPath & "\Output\" & nomfic & ".rep")
                        Montableau1(1) = "<%item_01%>"
                        Montableau1(2) = "<%prix_01%>"
                        Montableau1(3) = "<%cent_01%>"
                        Montableau2(1) = MaskedTextBox1.Text
                        Montableau2(2) = MaskedTextBox2.Text
                        If MaskedTextBox3.Text <> "" Then
                            Montableau2(3) = "." & MaskedTextBox3.Text & "€"
                        Else
                            Montableau2(3) = ""
                        End If
                        ReplaceString(Application.StartupPath & "\Output\" & nomfic & ".rep", Montableau1, Montableau2)
         End If
    End Sub
    On ne jouit bien que de ce qu’on partage.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 20
    Points : 12
    Points
    12
    Par défaut
    Merci beaucoup ça fonctionne

    Je vais pouvoir faire différents essais merci !!!!

    Après les testes, de 13 minutes, l'enregistrement passe à environ 3 minutes

    Merci infiniment

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

Discussions similaires

  1. Réduire le temps de traitement en optimisant les routines de connexion SQLite
    Par billybobbonnet dans le forum Accès aux données
    Réponses: 1
    Dernier message: 02/07/2014, 10h33
  2. Réponses: 2
    Dernier message: 26/12/2008, 05h37
  3. Réduire le temps de calcul
    Par nant44 dans le forum MATLAB
    Réponses: 2
    Dernier message: 14/03/2008, 09h36
  4. Réponses: 44
    Dernier message: 10/10/2007, 10h23
  5. Réduire le temps de chargement
    Par cqfd55com dans le forum Access
    Réponses: 4
    Dernier message: 20/02/2007, 17h58

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