43 messaggi dal 03 agosto 2010
Buongiorno a tutti,
il mio cruccio è graficare un file csv composto da 5000 righe e 48 colonne.

La lettura del CSV non è un problema...arrivo al ciclo for con la mia classe FILECSV gia bella che popolata da estrazione DB.

In sostanza ogni "canale" (colonna) contiente 5000 "valori"(righe)...
Utilizzando MVVM ho creato i seguenti Modelli

- CANALE
NomeCanale String
ListaDiPunti list(Of PUNTO)

- PUNTO
Valore Double
Tempo DateTime

ci metto la bellezza di 5 minuti per effettuare questo ciclo:

Dim TEMPList As New List(Of PUNTO)

For R As Integer = 0 To FILECSV.Righe- 1

Dim Point As New PUNTO

Dim TMPTime = CDate(FILECSV.Item(R,0))

Dim TMPDateTime As New DateTime(TMPTime.Ticks)

Point.Time = TMPDateTime

Point.Value = FILECSV.Item(R, SelectedChannel.ChannelColumn)

TEMPList.Add(Point)

Next

Idee? Suggerimenti?
Le sto provando tutte (operazione async, thread parallelo) ma niente.....utilizzando i breakpoint da debug per terminare il cliclo for ci impiega un tempo inaccettabile per una userexperience decente...

Vi ringrazio aticipatamente per la vostra collaborazine,
Saluti,
Massimiliano
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Massimiliano,
dovresti usare il profiler di Visual Studio per capire qual è, esattamente, la riga di codice che sta causando il rallentamento. Lo trovi solo sulle versioni commerciali (cioè: non Express).
Qui una guida per iniziare ad usarlo.
http://msdn.microsoft.com/en-us/library/ms182372.aspx

Il fatto è che se non sappiamo qual è il collo di bottiglia è inutile spostare il codice su altri thread, bisogna affrontare il problema direttamente e risolverlo. Poi si può pensare a come ottimizzare la user experience, ad esempio caricando la pagina per prima e poi ottenendo i dati da una richiesta ajax asincrona.

Ti faccio vedere brevemente come il profiler può aiutarti. Prendi un codice banale come questo:
//creo una lista di 10 milioni di interi
var elenco = Enumerable.Range(0, 10000000).ToList();
//calcolo la media
var media = elenco.Average();

E' difficile sapere a priori quale istruzione richiederà più risorse ma dal rapporto dei risultati, si vede che la prima ha richiesto un 39% mentre la seconda un 23% del tempo complessivo di elaborazione della pagina.

Io ora non ti posso dire come risolvere il problema; bisogna prima identificarlo. Il codice che hai postato mi pare ok, a parte due piccole cose che non penso assolutamente siano la causa.
  • La riga in cui valorizzi TMPDateTime non è necessaria, infatti avevi già ottenuto un DateTime dalla precedente chiamata a CDate.
  • Usi FILECSV.Item per l'accesso randomico ai dati che hai caricato dal CSV. L'ideale invece sarebbe leggere i dati in maniera forward-only ma, dato che le tue colonne contengono valori per canali diversi, dovresti strutturare il ciclo diversamente.

A proposito di FILECSV.Item, io ho l'impressione che il problema potrebbe essere là dentro. Tiene in memoria le righe del CSV in una List<T> oppure le legge da una sorgente IEnumerable? Posta il codice, forse ci dà qualche aiuto.

ciao,
Moreno
Modificato da BrightSoul il 05 ottobre 2013 12.48 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.