Actualmente estamos usando ZedGraph para dibujar un gráfico de líneas de algunos datos. Los datos de entrada provienen de un archivo de tamaño arbitrario, por lo tanto, no sabemos cuál es el número máximo de puntos de datos por adelantado. Sin embargo, al abrir el archivo y leer el encabezado, podemos averiguar cuántos puntos de datos hay en el archivo.Trazando cantidades masivas de datos
El formato de archivo es esencialmente [tiempo (doble), valor (doble)]. Sin embargo, las entradas no son uniformes en el eje de tiempo. Es posible que no haya ningún punto entre digamos t = 0 sec yt = 10 seg, pero puede haber 100K entires entre t = 10 seg yt = 11 seg, y así sucesivamente.
Como ejemplo, nuestro archivo de datos de prueba es ~ 2.6 GB y tiene 324M puntos. Nos gustaría mostrar el gráfico completo al usuario y dejarla navegar a través del gráfico. Sin embargo, cargar hasta 324M puntos en ZedGraph no solo es imposible (estamos en una máquina de 32 bits), sino que tampoco es útil ya que no tiene sentido tener tantos puntos en la pantalla.
El uso de la función FilteredPointList de ZedGraph también parece estar fuera de cuestión, ya que esto requiere cargar primero todos los datos y luego realizar el filtrado de esos datos.
tanto, a menos que nos falta nada, parece que nuestra única solución es -somehow- diezmar los datos, sin embargo a medida que seguimos trabajando en ello, nos estamos quedando en un montón de problemas:
1- ¿Cómo se diezman los datos que no llegan uniformemente a tiempo?
2- Dado que no se pueden cargar todos los datos en la memoria, cualquier algoritmo debe funcionar en el disco y debe diseñarse con cuidado.
3- ¿Cómo manejamos el acercamiento y alejamiento, especialmente cuando los datos no son uniformes en el eje x.
Si los datos fueron uniformes, con la carga inicial del gráfico, podríamos Seek()
por cantidad predefinida de entradas en el archivo, y elegir cada N otras muestras y alimentarlo a ZedGraph. Sin embargo, dado que los datos no son uniformes, debemos ser más inteligentes al elegir las muestras para mostrar, y no podemos encontrar ningún algoritmo inteligente que no tenga que leer todo el archivo.
Pido disculpas ya que la pregunta no tiene una especificidad nítida, pero espero poder explicar la naturaleza y el alcance de nuestro problema.
Estamos en Windows 32-bit, .NET 4.0.
De acuerdo en su último punto. Resumir los datos de forma adecuada aliviará el dolor de cabeza de mostrar x # de escenarios. –
gmagana: Sí, creo que suena como una manera de hacerlo. Solo me preocupa que cada vez que el usuario quiera acercarse o alejarse, tengamos que volver a leer y volver a resumir el archivo. Pensamos en algunos algoritmos de almacenamiento en caché, pero dado que en algún momento, los datos en el gráfico serán diezmados, el almacenamiento en caché de esos puntos puede no tener sentido. – SomethingBetter
@SomethingBetter: Sí, el zoom es una de las razones por las que escribí el mío. Necesitábamos algo así como el gráfico de Google Finance (es decir, http://www.google.com/finance?q=msft), así que lo escribí desde cero. –