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

Accès aux données Discussion :

Réduire le temps de traitement en optimisant les routines de connexion SQLite


Sujet :

Accès aux données

  1. #1
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 104
    Points : 69
    Points
    69
    Par défaut Réduire le temps de traitement en optimisant les routines de connexion SQLite
    Salut à tous,

    Je développe actuellement un programme en vb .net qui opère sur des fichiers texte conséquents. Je réalise un grand nombre de calculs sur les chaînes de caractères (par le biais de for each... next imbriqués les uns dans les autres). J'ai commencé par essayer de tout faire à la volée, en utilisant une combinaison de dictionnaires et de structures. Le souci est vite apparu: j'ai saturé mes 16 Go de Ram en 5mn de traitement en utilisant un fichier d'essai de 20 000 mots alors que je compte traiter des fichiers jusqu'à 300 000 mots.

    J'ai donc décidé d'inscrire au fur et à mesure les données dans une base SQLite. Dès mes premières tentatives, j'ai eu une erreur "unable to open database" liée au fait que je réutilisais à chaque requette la même instance de SQLiteConnection.

    J'ai donc choisi de réécrire une classe qui gère les lectures écritures SQLite en instanciant sans réfléchir SQLiteConnection à chaque action. Le programme a fonctionné correctement, mais le temps de traitement est passé à plus d'une heure pour les 20 000 mots.

    Je viens donc chercher de l'aide pour savoir quelle est la meilleure façon de structurer mes requêtes pour gagner du temps de traitement. Voir ci dessous ma classe de connexion avec en commentaires une estimation à la louche du nombre de requêtes envoyées à la suite:

    Code vb.net : 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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    Imports Finisar.SQLite
     
    Public Class DB_tools
        Dim ConnectionString1 As String = "Data Source=" & My.Application.Info.DirectoryPath & "\resources\test.db;Version=3;New=True;UTF8Encoding=True;Cache Size=3000;"
        Dim ConnectionString2 As String = "Data Source=" & My.Application.Info.DirectoryPath & "\resources\test.db;Version=3;New=False;UTF8Encoding=True;Cache Size=6000;"
     
        Public Sub New()
        End Sub
     
     'Fonction utilisée une seule fois
    Public Function CreateDB() As System.Exception
            Try
                Using c As New SQLiteConnection(ConnectionString1)
                    c.Open()
                    Dim mySelectQuery As String = "CREATE TABLE 'Words' ( Word VARCHAR(45), Number_of_words INTEGER (4));"
                    Dim sqCommand As SQLiteCommand = c.CreateCommand()
                    sqCommand.CommandText = mySelectQuery
                    sqCommand.ExecuteNonQuery()
                    c.Close()
                End Using
                Using c As New SQLiteConnection(ConnectionString2)
                    c.Open()
                    Dim mySelectQuery As String = "CREATE TABLE 'Sentences' ( Sentence TEXT, Number_of_words INTEGER (4));"
                    Dim sqCommand As SQLiteCommand = c.CreateCommand()
                    sqCommand.CommandText = mySelectQuery
                    sqCommand.ExecuteNonQuery()
                    c.Close()
                End Using
                Using c As New SQLiteConnection(ConnectionString2)
                    c.Open()
                    Dim mySelectQuery As String = "CREATE TABLE 'Paragraphs' (Paragraph TEXT, Number_of_words INTEGER (4));"
                    Dim sqCommand As SQLiteCommand = c.CreateCommand()
                    sqCommand.CommandText = mySelectQuery
                    sqCommand.ExecuteNonQuery()
                    c.Close()
                End Using
                Using c As New SQLiteConnection(ConnectionString2)
                    c.Open()
                    Dim mySelectQuery As String = "CREATE TABLE 'Global' ( Property VARCHAR(45), Value VARCHAR(4));"
                    Dim sqCommand As SQLiteCommand = c.CreateCommand()
                    sqCommand.CommandText = mySelectQuery
                    sqCommand.ExecuteNonQuery()
                    c.Close()
                    c.Dispose()
     
                End Using
                Return Nothing
            Catch ex As Exception
                Return ex
                MessageBox.Show(ex.ToString)
            End Try
     
        End Function
        Public Function write(ByRef MSG As String) As System.Exception 'Fonction utilisée soit une fois, soit sur une boucle de 3 à 50 itérations
            Try
                Using c As New SQLiteConnection(ConnectionString2)
                    c.Open()
                    Dim mySelectQuery As String = MSG
                    Dim sqCommand As SQLiteCommand = c.CreateCommand()
                    sqCommand.CommandText = mySelectQuery
                    sqCommand.ExecuteNonQuery()
                    c.Close()
                    c.Dispose()
     
                End Using
                Return Nothing
            Catch ex As Exception
                Return ex
                MessageBox.Show(ex.ToString)
            End Try
     
     
        End Function
        Public Function Read(ByRef MSG As String) As String 'fonction utilisée une seule fois à chaque passage
            Using c As New SQLiteConnection(ConnectionString2)
     
     
                c.Open()
                Dim mySelectQuery As String = MSG
                Dim sqCommand As SQLiteCommand = c.CreateCommand()
                sqCommand.CommandText = mySelectQuery
                Dim sqReader As SQLiteDataReader = sqCommand.ExecuteReader()
     
                While sqReader.Read()
                    Return sqReader.GetString(0)
                End While
                c.Close()
                c.Dispose()
                sqReader.Close()
            End Using
     
     
        End Function
    End Class

  2. #2
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    104
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 104
    Points : 69
    Points
    69
    Par défaut
    J'ai refait ma fonction en changeant de connecteur SQLite (le finisar n'est pas complet, j'ai repris l'original) et j'ai batché toutes mes requêtes en trois transactions. Résultat: le traitement dure moins de 2 secondes avec 20000 mots.

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

Discussions similaires

  1. [Socket] optimiser les paramètres de connexion
    Par Auteur dans le forum Entrée/Sortie
    Réponses: 15
    Dernier message: 25/05/2009, 11h56
  2. Comment optimiser les temps de réponse d'une requête ?
    Par renaudjuif dans le forum Requêtes
    Réponses: 3
    Dernier message: 19/02/2007, 14h12
  3. Optimisation du temps de traitement
    Par djuddju dans le forum Oracle
    Réponses: 4
    Dernier message: 20/04/2006, 21h16
  4. [XSLT] Comment optimiser les traitements XML/XSL ?
    Par thibaut06 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 24/03/2006, 16h39
  5. optimisation de temps de traitement xml/xslt
    Par Erwy dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 06/05/2004, 16h08

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