Accélérer le tracé d'un graphe ?

masena Messages postés 18 Date d'inscription mercredi 1 avril 2009 Statut Membre Dernière intervention 23 décembre 2010 - 9 déc. 2010 à 16:45
masena Messages postés 18 Date d'inscription mercredi 1 avril 2009 Statut Membre Dernière intervention 23 décembre 2010 - 23 déc. 2010 à 08:50
Bonjour,

Je développe actuellement un programme qui permet de tracer 3 graphes à partir de données d'un document texte. LE code que j'utilise pour les graphes est le suivant :

OuvertureFichier(OpenFileDialog1.FileName)
TextBox1.Text = OpenFileDialog1.FileName

'On trace le graphique

Chart1.Series("Series1").Points.DataBindXY(S0, S1)

Chart2.Series("Series1").Points.DataBindXY(S0, S2)

Chart3.Series("Series1").Points.DataBindXY(S0, S3)

Les tableaux unidimmensionel S0, S1, S2 et S3 contiennent les données.

IL y a au total quasiment 500 000 lignes dans chaque tableau, ce qui rend le tracé du graphe assez long. Y a t'il un autre moyen plus rapide de tracer ces graphes ?

Merci

18 réponses

nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
10 déc. 2010 à 13:33
Salut,

Tu utilises quoi comme composant graphique
et tu peux utilises par exemple du multi thread pour faire
le tracé.
0
masena Messages postés 18 Date d'inscription mercredi 1 avril 2009 Statut Membre Dernière intervention 23 décembre 2010
17 déc. 2010 à 10:41
Je me sert du composant graphique intégré dans visual basic express 2010 (j'ai ajouter mes 3 graphes depuis la boite à outil).

Le multi thread m'a l'air interresant, comment cela fonctionne ,

Merci
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
17 déc. 2010 à 15:39
Voici le code que j'ai de mon coté.
Oups il est en c#

Regardes le et dis ce que tu veux acceler.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        List<CustomersPoco> listCustomers = new List<CustomersPoco>();
        northwndEntities n = new northwndEntities(); 
        public Form1()
        {
            InitializeComponent();
            LoadCustomers();
        }

        public void LoadCustomers()
        {

            listCustomers = (from c in n.Customers
                             let cCount =
                             (
                                from o in n.Orders
                                where c.CustomerID == o.CustomerID
                                select o
                             ).Count()
                             select new CustomersPoco { ContactName c.ContactName, NbOrdre cCount }).ToList();
            chart1.Series[0].XValueMember = "ContactName";
            chart1.Series[0].YValueMembers = "NbOrdre";
            ReLoadCustomers(this,null);
        }

        private void ReLoadCustomers(object sender, EventArgs e)
        {
            chart1.DataSource = listCustomers;
            chart1.DataBind();
        }

        private void chart1_Click(object sender, EventArgs e)
        {
            timer1.Interval = 2000;
            timer1.Enabled = !timer1.Enabled;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            Random r = new Random();
            foreach (var item in listCustomers)
            {
                item.NbOrdre = (int)r.Next(1, 30);
            }
            EventHandler reLoadCustomers = new EventHandler(ReLoadCustomers);
            this.Invoke(reLoadCustomers, new object[] { null, null });
        }  
    }

    public class CustomersPoco 
    {
        public string ContactName { get; set; }
        public int NbOrdre { get; set; }

    }
}

0
masena Messages postés 18 Date d'inscription mercredi 1 avril 2009 Statut Membre Dernière intervention 23 décembre 2010
21 déc. 2010 à 09:40
En fait dans ton code tu ne graphe qu'un seul graph. Ce que je voudrais faire c'est réussir à tracer mes 3 graphes en même temps et pas les uns après les autres.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
21 déc. 2010 à 10:09
Je ne vois pas le probleme,
tu crées une série par graphe et puis ca doit rouler.

chart1.Series[0].XValueMember = "ContactName";
chart1.Series[0].YValueMembers = "NbOrdre";
chart1.Series[1].XValueMember = "ContactName";
chart1.Series[1].YValueMembers = "CA";
0
masena Messages postés 18 Date d'inscription mercredi 1 avril 2009 Statut Membre Dernière intervention 23 décembre 2010
21 déc. 2010 à 10:18
Ben le code pour rentrer les données marche bien avec : Chart1.Series("Series1").Points.DataBindXY(S0, S1)

Le souci c'est que c'est hyper long, je ne vois pas comment transcrire ton code en VB pour accélérer mon tracé.
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
21 déc. 2010 à 10:35
J'ai pas de vb sous la main.

chart1.Series("Series1").XValueMember = "ContactName";
chart1.Series("Series1").YValueMembers = "NbOrdre";
chart1.Series("Series2").XValueMember = "ContactName";
chart1.Series("Series2").YValueMembers = "CA"; 


Si tu utilises des classes.

Comment sont renseigné S0 et S1, c'est peut etre la le probleme???
0
masena Messages postés 18 Date d'inscription mercredi 1 avril 2009 Statut Membre Dernière intervention 23 décembre 2010
21 déc. 2010 à 11:00
S0 et S1 sont des tableaux unidimensionnel qui comporte environ 400 000 lignes, c'est ca qui rend long le tracé.
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
21 déc. 2010 à 11:15
Comment ils sont remplis.

Est-ce que tous les données sont nécéssaires? à chaque série.

Il serait peut-être intéressant de virtualiser les données?

Apres il me manque des elements pour répôndre à la question.
0
masena Messages postés 18 Date d'inscription mercredi 1 avril 2009 Statut Membre Dernière intervention 23 décembre 2010
21 déc. 2010 à 11:41
Voila en gros le code qui représente la façon de les remplir :

For i = debut To nblignes - 1
S0(j) = j * dt
S1(j) = Val(T(i).Split(" ")(tnumoc + 2))
S2(j) = Val(T(i).Split(" ")(tnumoc + 0))
S3(j) = Val(T(i).Split(" ")(tnumoc + 1))
j = j + 1
Next i

Sachant que T(i) représente une string contenant des données organisées de la façon suivante :
5.5000e-002 1.389027e-002 2.000809e-002 2.392054e-002

On vient en fait récupérer des données dans un fichier texte contenant 400 000 ligne similaire à T(i).

On a vraiment besoin de toutes les données car on va effectuer un traitement numérique sur ces données.
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
21 déc. 2010 à 12:14
1 --> N'utilises pas Val mais Convert.ToDouble
2 --> Factorises le T(i) pour ne pas faire le split 3 fois

3 --> Tu lis ton fichier ligne par ligne?? Comment est chargé ton fichier.
0
masena Messages postés 18 Date d'inscription mercredi 1 avril 2009 Statut Membre Dernière intervention 23 décembre 2010
21 déc. 2010 à 13:20
Je lit effectivement mon fichier ligne par ligne de la facon suivante :
Dim sr As New StreamReader(NomFichier)
While sr.Peek <> -1
i = i + 1
T(i) = sr.ReadLine
End While
sr.Close()

Qu'entend tu par factoriser le T(i) ?
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
21 déc. 2010 à 14:20
Voici le code pour lire un fichier, c'est peut etre plus rapide.

          var sr = new StreamReader(NomFichier);
 
          string line ;
          while((line = sr.ReadLine()) != null)
          {
              listBox1.Items.Add(line);//NB c'est pour le test :-)
          }


Pour la factorisation
c'est ca permet de faire qu'une fois le calcul du split.
For i = debut To nblignes - 1
    S0(j) = j * dt
    temp = Val(T(i).Split(" ")
    S1(j) = temp(tnumoc + 2))
    S2(j) = temp(tnumoc + 0))
    S3(j) = temp(tnumoc + 1))
j = j + 1
Next i 



Tu n'a pas répondu à la question sur la nécéssécité de toutes les données.
0
masena Messages postés 18 Date d'inscription mercredi 1 avril 2009 Statut Membre Dernière intervention 23 décembre 2010
21 déc. 2010 à 14:47
Désolé, j'ai effectivement besoin de toutes les données pour effectuer un traitement numérique dessus par la suite.

Je ne connaissait pas la méthode de factorisation, c'est super intéressant !!
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
21 déc. 2010 à 16:20
Oui mais pour le graphe peut etre pas toutes les données.

Tu peux sans doute extraire que celle qui sont affichée.

As-tu pris les temps de chargements avec le graphe et sans le graphe
pour voir ou ca coince.
0
masena Messages postés 18 Date d'inscription mercredi 1 avril 2009 Statut Membre Dernière intervention 23 décembre 2010
22 déc. 2010 à 12:05
En fait ce qui est long c'est le chargement du fichier et le tracé du graphe. Je pense pas que l'on puisse améliorer le chargement du fichier donc je me pense sur le tracé du graphe. Je vais essayer d'utiliser les OWC pour voir ce que ça dit puisque dans mon application l'utilisateur doit pourvoir faire des manip simple sur le graphe.

Merci pour toutes les infos que tu m'as fourni, je refait un post pour dire le résultat des OWC.
0
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Membre Dernière intervention 15 juillet 2011 37
22 déc. 2010 à 17:47
Qu'est ce que tu appelles OWC.

Il y a peut etre moyen de faire du multithread aussi.

N?B : je ne vois pas l'interet d'avoir 4 millions de poins pour tracé un graphe.

Il y a peut etre moins que prendre qu'un extrait?
0
masena Messages postés 18 Date d'inscription mercredi 1 avril 2009 Statut Membre Dernière intervention 23 décembre 2010
23 déc. 2010 à 08:50
C'est les office web component, en fait je vais lier une spreadsheet a mon graphique.

Le multithread n'est pas pour autant abandonné.

Je suis un peu obliger d'avoir 4millions de points car en gros les valeurs sont un coup positive un coup négative donc je ne pense pas que l'on puisse faire un extrait.
0
Rejoignez-nous