Attualmente stiamo utilizzando ZedGraph per disegnare un grafico a linee di alcuni dati. I dati di input provengono da un file di dimensioni arbitrarie, pertanto, non sappiamo in anticipo quale sia il numero massimo di punti dati. Tuttavia, aprendo il file e leggendo l'intestazione, possiamo scoprire quanti punti di dati ci sono nel file.Creazione di enormi quantità di dati
Il formato del file è essenzialmente [tempo (doppio), valore (doppio)]. Tuttavia, le voci non sono uniformi nell'asse del tempo. Potrebbero non esserci punti tra say t = 0 sec e t = 10 sec, ma potrebbero esserci 100K entrate tra t = 10 sec e t = 11 sec, e così via.
Ad esempio, il nostro file del set di dati di test è ~ 2,6 GB e ha 324 milioni di punti. Vorremmo mostrare l'intero grafico all'utente e farle navigare nel grafico. Tuttavia, caricare fino a 324 milioni di punti su ZedGraph non solo è impossibile (siamo su una macchina a 32 bit), ma non è neanche utile dato che non ha senso avere così tanti punti sullo schermo.
Anche l'utilizzo della funzione FilteredPointList di ZedGraph sembra essere fuori questione, poiché è necessario caricare prima tutti i dati e quindi eseguire il filtraggio su tali dati.
Quindi, a meno che non ci manca niente, sembra che la nostra unica soluzione è quella di -somehow- decimare i dati, tuttavia, come continuiamo a lavorare su di esso, stiamo correndo in un sacco di problemi:
1- Come decimiamo i dati che non arrivano in modo uniforme in tempo?
2- Poiché non è possibile caricare in memoria tutti i dati, è necessario che qualsiasi algoritmo funzioni sul disco e pertanto deve essere progettato con attenzione.
3- Come si gestisce lo zoom in entrata e in uscita, soprattutto quando i dati non sono uniformi sull'asse x.
Se i dati erano uniformi, al caricamento iniziale del grafico, è possibile immettere Seek()
in base alla quantità predefinita di voci nel file e scegliere ogni N altri campioni e inviarlo a ZedGraph. Tuttavia, poiché i dati non sono uniformi, dobbiamo essere più intelligenti nella scelta dei campioni da visualizzare e non possiamo trovare alcun algoritmo intelligente che non debba leggere l'intero file.
Mi scuso perché la domanda non ha specificità taglienti, ma spero di poter spiegare la natura e la portata del nostro problema.
Siamo su Windows a 32 bit, .NET 4.0.
Concordato sul tuo ultimo punto. Riassumere adeguatamente i dati allevierà il mal di testa della visualizzazione di x # di scenari. –
gmagana: Sì, penso che suona come un modo per andare. Sono solo preoccupato che ogni volta che l'utente vuole ingrandire o rimpicciolire, dovremo rileggere e riassumere il file. Abbiamo pensato ad alcuni algoritmi di memorizzazione nella cache, ma poiché in qualsiasi momento i dati sul grafico saranno decimati, il caching di quei punti potrebbe non avere senso. – SomethingBetter
@SomethingBetter: Sì, lo zoom è uno dei motivi per cui ho scritto il mio. Avevamo bisogno di qualcosa come il grafico di Google Finance (ad esempio, http://www.google.com/finance?q=msft), quindi l'ho scritto da zero. –