CPU à 100% pendant l'ecriture d'un fichier texte

Le
BBComp
Bonjour à tous,
J'ai une fonction d'export dans une application vb.net.
Cette fonction crée un datatable et ecrit le resultat dans un fichier texte
que je renvoi en flux au navigateur.
Pendant l'ecriture du fichier le CPU est à 100%
J'ai beau essayer d'optimiser tout cela, j'arrive a accelerer l'export (le
cpu plafonne donc moins longtemps) mais il reste à 100%.
De ce fait, lors d'un export, tout le reste du site rame
Auriez-vous une astuce qui permette de plafonner le processeur pour l'import
ou une fonction ou autre qui me permette d'optimiser tout cela ?

Pour info, j'utilise un streamwriter pour créer le fichier avant de
l'envoyer en flux.

Merci d'avance.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Gilles TOURREAU
Le #12182921
Le Fri, 15 Jun 2007 10:36:01 +0200, BBComp

Bonjour à tous,
J'ai une fonction d'export dans une application vb.net.
Cette fonction crée un datatable et ecrit le resultat dans un fichier
texte
que je renvoi en flux au navigateur.
Pendant l'ecriture du fichier le CPU est à 100%...
J'ai beau essayer d'optimiser tout cela, j'arrive a accelerer l'export
(le
cpu plafonne donc moins longtemps) mais il reste à 100%.
De ce fait, lors d'un export, tout le reste du site rame...
Auriez-vous une astuce qui permette de plafonner le processeur pour
l'import
ou une fonction ou autre qui me permette d'optimiser tout cela ?

Pour info, j'utilise un streamwriter pour créer le fichier avant de
l'envoyer en flux.

Merci d'avance.



Pouvez détailler ce que vous faites avec votre DataTable, et la lecture du
fichier lors de l'envoi au navigateur ?

Cordialement

--
Gilles TOURREAU


S.A.R.L. P.O.S
Le spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr
BBComp
Le #12182911
Bonjour Gilles et merci pour cette reponse rapide !
Voici le detail :
l'export de deroule en 2 etapes, la premiere est la création du fichier, la
deuxième et l'envoi en flux au navigateur.

Tout d'abord, je genere un xml en sérialisant le datatable resultat de ma
requete. Ce process prend quelques secondes :
-------------------------------------------------------------------
Dim ser As New XmlSerializer(GetType(DataSet))
Dim writer As New XmlTextWriter(p_path & nomFichierComplet,
System.Text.Encoding.UTF8)
Dim filexml As New XmlDocument
Dim sw As New StreamWriter(p_path & nomFichierCSV, False,
System.Text.Encoding.UTF8)
ser.Serialize(writer, dt.DataSet)
writer.Close()
-------------------------------------------------------------------
Une fois que ce XML est genéré, je le parcours ligne par ligne en mettant
dans un stringbuilder le contenu avec mon séparateur.
Toutes les 300 lignes, j'ecris dans mon fichier texte (à l'aide du
streamwriter) les 300 ligne, je vide mon stringbuilder et je recommence.

-------------------------------------------------------------------
pas = 300
For Each noeud As XmlNode In node
For Each title As String In nodeTitle
If Not noeud.SelectNodes(title.ToString).Count = 0 Then
line.Append(Me._actualSep)

line.Append(noeud.SelectSingleNode(title.ToString).InnerText)
Me._actualSep = Me._sep
Else
line.Append(Me._actualSep)
Me._actualSep = Me._sep
End If
Next
ct = ct + 1
Me._actualSep = ""
line.Append(Me._sepRow)
If ct = pas Then
strResult.WriteLine(line)
line.Remove(0, line.Length - 1)
End If
Next
strResult.WriteLine(line)
-------------------------------------------------------------------

Voici l'envoi en flux :
-------------------------------------------------------------------
Dim fichier As New FileInfo(chemin & nomFichier)
HttpContext.Current.Response.ContentType = "application/octet-stream"
HttpContext.Current.Response.BufferOutput = False
HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;
filename=" & nomFichier)
HttpContext.Current.Response.AddHeader("Content-Length", fichier.Length)
HttpContext.Current.Response.Flush()
HttpContext.Current.Response.WriteFile(chemin & nomFichier)
HttpContext.Current.Response.Flush()
-------------------------------------------------------------------

voilà, j'espere que cela vous suffira.
merci d'avance pour votre aide.



"Gilles TOURREAU" a écrit :

Le Fri, 15 Jun 2007 10:36:01 +0200, BBComp

> Bonjour à tous,
> J'ai une fonction d'export dans une application vb.net.
> Cette fonction crée un datatable et ecrit le resultat dans un fichier
> texte
> que je renvoi en flux au navigateur.
> Pendant l'ecriture du fichier le CPU est à 100%...
> J'ai beau essayer d'optimiser tout cela, j'arrive a accelerer l'export
> (le
> cpu plafonne donc moins longtemps) mais il reste à 100%.
> De ce fait, lors d'un export, tout le reste du site rame...
> Auriez-vous une astuce qui permette de plafonner le processeur pour
> l'import
> ou une fonction ou autre qui me permette d'optimiser tout cela ?
>
> Pour info, j'utilise un streamwriter pour créer le fichier avant de
> l'envoyer en flux.
>
> Merci d'avance.

Pouvez détailler ce que vous faites avec votre DataTable, et la lecture du
fichier lors de l'envoi au navigateur ?

Cordialement

--
Gilles TOURREAU


S.A.R.L. P.O.S
Le spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr



Gilles TOURREAU
Le #12182881
Le Fri, 15 Jun 2007 10:59:01 +0200, BBComp

Bonjour Gilles et merci pour cette reponse rapide !
Voici le detail :
l'export de deroule en 2 etapes, la premiere est la création du fichier,
la
deuxième et l'envoi en flux au navigateur.

Tout d'abord, je genere un xml en sérialisant le datatable resultat de ma
requete. Ce process prend quelques secondes :
-------------------------------------------------------------------
Dim ser As New XmlSerializer(GetType(DataSet))
Dim writer As New XmlTextWriter(p_path & nomFichierComplet,
System.Text.Encoding.UTF8)
Dim filexml As New XmlDocument
Dim sw As New StreamWriter(p_path & nomFichierCSV, False,
System.Text.Encoding.UTF8)
ser.Serialize(writer, dt.DataSet)
writer.Close()
-------------------------------------------------------------------
Une fois que ce XML est genéré, je le parcours ligne par ligne en mettant
dans un stringbuilder le contenu avec mon séparateur.
Toutes les 300 lignes, j'ecris dans mon fichier texte (à l'aide du
streamwriter) les 300 ligne, je vide mon stringbuilder et je recommence.

-------------------------------------------------------------------
pas = 300
For Each noeud As XmlNode In node
For Each title As String In nodeTitle
If Not noeud.SelectNodes(title.ToString).Count = 0 Then
line.Append(Me._actualSep)
line.Append(noeud.SelectSingleNode(title.ToString).InnerText)
Me._actualSep = Me._sep
Else
line.Append(Me._actualSep)
Me._actualSep = Me._sep
End If
Next
ct = ct + 1
Me._actualSep = ""
line.Append(Me._sepRow)
If ct = pas Then
strResult.WriteLine(line)
line.Remove(0, line.Length - 1)
End If
Next
strResult.WriteLine(line)
-------------------------------------------------------------------

Voici l'envoi en flux :
-------------------------------------------------------------------
Dim fichier As New FileInfo(chemin & nomFichier)
HttpContext.Current.Response.ContentType = "application/octet-stream"
HttpContext.Current.Response.BufferOutput = False
HttpContext.Current.Response.AddHeader("Content-Disposition",
"attachment;
filename=" & nomFichier)
HttpContext.Current.Response.AddHeader("Content-Length", fichier.Length)
HttpContext.Current.Response.Flush()
HttpContext.Current.Response.WriteFile(chemin & nomFichier)
HttpContext.Current.Response.Flush()
-------------------------------------------------------------------

voilà, j'espere que cela vous suffira.
merci d'avance pour votre aide.



"Gilles TOURREAU" a écrit :

Le Fri, 15 Jun 2007 10:36:01 +0200, BBComp

> Bonjour à tous,
> J'ai une fonction d'export dans une application vb.net.
> Cette fonction crée un datatable et ecrit le resultat dans un fichier
> texte
> que je renvoi en flux au navigateur.
> Pendant l'ecriture du fichier le CPU est à 100%...
> J'ai beau essayer d'optimiser tout cela, j'arrive a accelerer l'export
> (le
> cpu plafonne donc moins longtemps) mais il reste à 100%.
> De ce fait, lors d'un export, tout le reste du site rame...
> Auriez-vous une astuce qui permette de plafonner le processeur pour
> l'import
> ou une fonction ou autre qui me permette d'optimiser tout cela ?
>
> Pour info, j'utilise un streamwriter pour créer le fichier avant de
> l'envoyer en flux.
>
> Merci d'avance.

Pouvez détailler ce que vous faites avec votre DataTable, et la lecture
du
fichier lors de l'envoi au navigateur ?

Cordialement

--
Gilles TOURREAU


S.A.R.L. P.O.S
Le spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr






Déjà comme tu fais de l'écriture bloc par bloc je suppose que tu dois
écrire énormement de données.

Pourquoi :
- tu sérialises un DataTable dans un fichier XML pour ensuite le relire ?
- tu lis le fichier XML et tu mets des enregistrements dans un fichier
texte ?

Tu ne pourrais pas plustôt parcourir ton DataTable et l'écrire dans le
flux HTTP directement ?

Cordialement

--
Gilles TOURREAU


S.A.R.L. P.O.S
Le spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr
BBComp
Le #12182851
Bonjour,
effectivement, la transformation en xml ne sert a rien mais j'ai testé pas
mal de chose pour optimiser tout cela ...
Bref, j'ai remodifier mon code et je renvoi en flux directement le fichier a
partir du datatable mais cela n'a rien changé à mon problème.
Mon export dur 50 secondes à 1 minute pendant lesquelles mon site ne repond
plus du tout...

une solution serais de lancer l'export en lui precisant de na pas pouvoir
prendre plus de 30% du processeur... Est-ce possible ? et si oui, comment ???

Merci d'avance

"Gilles TOURREAU" a écrit :

Le Fri, 15 Jun 2007 10:59:01 +0200, BBComp

> Bonjour Gilles et merci pour cette reponse rapide !
> Voici le detail :
> l'export de deroule en 2 etapes, la premiere est la création du fichier,
> la
> deuxième et l'envoi en flux au navigateur.
>
> Tout d'abord, je genere un xml en sérialisant le datatable resultat de ma
> requete. Ce process prend quelques secondes :
> -------------------------------------------------------------------
> Dim ser As New XmlSerializer(GetType(DataSet))
> Dim writer As New XmlTextWriter(p_path & nomFichierComplet,
> System.Text.Encoding.UTF8)
> Dim filexml As New XmlDocument
> Dim sw As New StreamWriter(p_path & nomFichierCSV, False,
> System.Text.Encoding.UTF8)
> ser.Serialize(writer, dt.DataSet)
> writer.Close()
> -------------------------------------------------------------------
> Une fois que ce XML est genéré, je le parcours ligne par ligne en mettant
> dans un stringbuilder le contenu avec mon séparateur.
> Toutes les 300 lignes, j'ecris dans mon fichier texte (à l'aide du
> streamwriter) les 300 ligne, je vide mon stringbuilder et je recommence.
>
> -------------------------------------------------------------------
> pas = 300
> For Each noeud As XmlNode In node
> For Each title As String In nodeTitle
> If Not noeud.SelectNodes(title.ToString).Count = 0 Then
> line.Append(Me._actualSep)
> line.Append(noeud.SelectSingleNode(title.ToString).InnerText)
> Me._actualSep = Me._sep
> Else
> line.Append(Me._actualSep)
> Me._actualSep = Me._sep
> End If
> Next
> ct = ct + 1
> Me._actualSep = ""
> line.Append(Me._sepRow)
> If ct = pas Then
> strResult.WriteLine(line)
> line.Remove(0, line.Length - 1)
> End If
> Next
> strResult.WriteLine(line)
> -------------------------------------------------------------------
>
> Voici l'envoi en flux :
> -------------------------------------------------------------------
> Dim fichier As New FileInfo(chemin & nomFichier)
> HttpContext.Current.Response.ContentType = "application/octet-stream"
> HttpContext.Current.Response.BufferOutput = False
> HttpContext.Current.Response.AddHeader("Content-Disposition",
> "attachment;
> filename=" & nomFichier)
> HttpContext.Current.Response.AddHeader("Content-Length", fichier.Length)
> HttpContext.Current.Response.Flush()
> HttpContext.Current.Response.WriteFile(chemin & nomFichier)
> HttpContext.Current.Response.Flush()
> -------------------------------------------------------------------
>
> voilà, j'espere que cela vous suffira.
> merci d'avance pour votre aide.
>
>
>
> "Gilles TOURREAU" a écrit :
>
>> Le Fri, 15 Jun 2007 10:36:01 +0200, BBComp
>> >>
>> > Bonjour à tous,
>> > J'ai une fonction d'export dans une application vb.net.
>> > Cette fonction crée un datatable et ecrit le resultat dans un fichier
>> > texte
>> > que je renvoi en flux au navigateur.
>> > Pendant l'ecriture du fichier le CPU est à 100%...
>> > J'ai beau essayer d'optimiser tout cela, j'arrive a accelerer l'export
>> > (le
>> > cpu plafonne donc moins longtemps) mais il reste à 100%.
>> > De ce fait, lors d'un export, tout le reste du site rame...
>> > Auriez-vous une astuce qui permette de plafonner le processeur pour
>> > l'import
>> > ou une fonction ou autre qui me permette d'optimiser tout cela ?
>> >
>> > Pour info, j'utilise un streamwriter pour créer le fichier avant de
>> > l'envoyer en flux.
>> >
>> > Merci d'avance.
>>
>> Pouvez détailler ce que vous faites avec votre DataTable, et la lecture
>> du
>> fichier lors de l'envoi au navigateur ?
>>
>> Cordialement
>>
>> --
>> Gilles TOURREAU
>>
>>
>> S.A.R.L. P.O.S
>> Le spécialiste en motoculture depuis + de 30 ans !
>> http://www.pos.fr
>>

Déjà comme tu fais de l'écriture bloc par bloc je suppose que tu dois
écrire énormement de données.

Pourquoi :
- tu sérialises un DataTable dans un fichier XML pour ensuite le relire ?
- tu lis le fichier XML et tu mets des enregistrements dans un fichier
texte ?

Tu ne pourrais pas plustôt parcourir ton DataTable et l'écrire dans le
flux HTTP directement ?

Cordialement

--
Gilles TOURREAU


S.A.R.L. P.O.S
Le spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr



Gilles TOURREAU
Le #12182841
Juste par curiosité :

Est-tu obligé de charger tout ce que tu dois exporter dans un DataTable
avant de l'envoyer en HTTP ?

Cordialement

--
Gilles TOURREAU


S.A.R.L. P.O.S
Le spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr
Publicité
Poster une réponse
Anonyme