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 :

[VB.NET] DataReader qui prend enormement de memoire


Sujet :

Windows Forms

  1. #1
    Membre du Club

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 21
    Points : 43
    Points
    43
    Par défaut [VB.NET] DataReader qui prend enormement de memoire
    Bonjour à tous.

    J'ai un probleme sur la ram que prend un datareader

    j'ai une requete retournant 320 000 enregistrements
    je dois exporter ce resultat
    pour ne pas charger ces enregistrements en memoire par un datatable, je fais un datareader

    je boucle dessus
    et à chaque ligne, je concatène les champs avec un séparateur et à la fin de ligne, je l'écris dans le fichier

    or il me prend un maximum de mémoire


    why ?

    pourtant j'écris bien directement chaque ligne dans le fichier, donc il devrait lbéré au fur et à mesure....

    Please help !

    merci par avance

  2. #2
    Membre chevronné
    Avatar de Piotrek
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 869
    Points : 1 904
    Points
    1 904
    Par défaut
    Salut

    Utilise un StringBuilder au lieu de faire une concatenation avec + ou & car il evite de creer une nouvelle variable pour le resultat
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemtextstringbuilderclassappendtopic.asp

    ca va s'accelerer

  3. #3
    Membre du Club

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 21
    Points : 43
    Points
    43
    Par défaut
    merci à toi

    en fait, je viens d'essayer et j'obtiens le meme resultat...



    la memoire est consommée jusqu'au bout...

  4. #4
    Membre chevronné
    Avatar de Piotrek
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 869
    Points : 1 904
    Points
    1 904
    Par défaut
    Fais voir un echantillon de code

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 58
    Points : 50
    Points
    50
    Par défaut
    Salut

    Je sais pas trop si ca peux t'aider mais si tu essaie de faire un flush à la fin de chaque ligne?

  6. #6
    Membre du Club

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 21
    Points : 43
    Points
    43
    Par défaut
    merci a toi de t'intéresser à mon probleme

    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
     
    'On ouvre le fichier
    fs = New FileStream(chemin & nomFichier, FileMode.Create, FileAccess.Write)
    'On ouvre un flux
    sw = New StreamWriter(fs, System.Text.Encoding.Default)
    'On enregistre ligne par ligne
    If ird.Read Then
    	nbColumns = ird.FieldCount
    	Do
    		'Pour chaque colonne, on ajoute la valeur à la ligne temporaire
    		temp = ""
    		For i As Integer = 0 To nbColumns - 1
    			If isFirst = True Then
    	        		isFirst = False
    		    	Else
            			temp &= caractSeparateur
    			End If
    			temp &= caractAutourValeur & ird.Item(i) & caractAutourValeur
    	       	Next
    	        'On écrit la ligne
            	sw.Write(temp & caractFinLigne)
    	        sw.Flush()
            	temp = Nothing
    	Loop While ird.Read
    End If
    'On ferme le flux
    sw.Close()
    'On ferme le fichier
    fs.Close()
    ird est un idatareader en fait
    j'exécute ma requete au dessus

    j'ai aussi essayé avec un stringbuilder, mais le resultat est identique

    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
     
    'On ouvre le fichier
    fs = New FileStream(chemin & nomFichier, FileMode.Create, FileAccess.Write)
    'On ouvre un flux
    sw = New StreamWriter(fs, System.Text.Encoding.Default)
    'On enregistre ligne par ligne
    If ird.Read Then
    	nbColumns = ird.FieldCount
    	Do
    		'Pour chaque colonne, on ajoute la valeur à la ligne temporaire
    		sb = New System.Text.StringBuilder("")
    		For i As Integer = 0 To nbColumns - 1
    			If isFirst = True Then
    	        		isFirst = False
    		    	Else
            			sb = sb.Append(caractSeparateur)
    			End If
    			sb = sb.Append(caractAutourValeur & ird.Item(i) & caractAutourValeur)
    	       	Next
    	        'On écrit la ligne
            	sb = sb.Append(caractFinLigne)
     		sw.Write(sb.ToString)
    	        sw.Flush()
    	Loop While ird.Read
    End If
    'On ferme le flux
    sw.Close()
    'On ferme le fichier
    fs.Close()

  7. #7
    Membre chevronné
    Avatar de Piotrek
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 869
    Points : 1 904
    Points
    1 904
    Par défaut
    Remarques:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sb.Append(caractSeparateur)
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sb = sb.Append(caractSeparateur)
    il ne faut pas faire de sb =

    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    sb.Append(caractAutourValeur)
    sb.Append(ird.Item(i))
    sb.Append(caractAutourValeur)
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sb = sb.Append(caractAutourValeur & ird.Item(i) & caractAutourValeur)
    Quite a eviter la concatemation, autant l'eviter totalement

  8. #8
    Membre du Club

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 21
    Points : 43
    Points
    43
    Par défaut
    ok je teste
    j'ai trouvé ça comme exemple dans le lienq ue tu m'as donné

  9. #9
    Membre du Club

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 21
    Points : 43
    Points
    43
    Par défaut
    impressionnant !!!!!

    délirant !!!!!!!

    c'est excellent ! des dizaines de fois plus rapide en faisant ça ! aucun problème !!!!!!! la mémoire ne bouge quasi pas !!!! c'est génial


    yyyeeesssss





    un très très grand merci !

  10. #10
    Membre chevronné
    Avatar de Piotrek
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 869
    Points : 1 904
    Points
    1 904
    Par défaut
    ah oui effectivement j'y suis alle un peu vite en googleant...
    je sais pas ce qui leur a pris de faire ca chez MS

    [RAJOUT] cool tu peux encore gagner 10-30% de perfs en estimant la capacite du stringbuilder et en concatenant toutes les n lignes

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

Discussions similaires

  1. [VB.NET] DataReader: case par case
    Par prem's dans le forum Windows Forms
    Réponses: 22
    Dernier message: 08/04/2005, 12h43
  2. [VB.NET] DataReader
    Par sephiroth84 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 03/02/2005, 14h16
  3. programme qui consomme beaucoup de memoire
    Par gaut dans le forum Windows
    Réponses: 10
    Dernier message: 01/02/2005, 20h33
  4. [VB.NET] DataSet qui ne retourne pas de résultat
    Par Lois dans le forum Windows Forms
    Réponses: 4
    Dernier message: 02/06/2004, 17h07
  5. [VB.NET] Classe qui pilote des Fichier .INI
    Par sygale dans le forum Windows Forms
    Réponses: 3
    Dernier message: 01/06/2004, 20h04

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