2012-07-12 3 views
1

Je cherche des approches pour compresser une grande quantité (et une croissance dynamique) de données pour la visualisation dans une vue graphique.Approches pour une visualisation rapide d'une énorme quantité de données

Disons que j'ai un fichier binaire composé de paires de valeurs d'horodatage. Ce fichier est en croissance en temps réel et peut facilement dépasser plusieurs gigaoctets.

Il existe maintenant plusieurs vues affichant ces données sous forme de graphique/tracé. Puisque dans la plupart des cas, il y a beaucoup plus de données que de pixels sur notre axe des x, nous devons compresser ces données d'une manière ou d'une autre à la résolution désirée. Chaque vue peut nécessiter une résolution différente en fonction de sa taille sur l'écran. Un zoom avant et arrière entraînera également des changements rapides de cette résolution.

L'algorithme actuel divise les données en sections de longueur égale et calcule la valeur minimale et maximale. Maintenant, pour chaque pixel sur notre axe des x, nous dessinons une ligne verticale de la valeur min à la valeur max. De cette façon, nous pouvons être sûrs de ne pas manquer les valeurs aberrantes. (Ce qui est une exigence)

Chaque fois qu'une nouvelle résolution est nécessaire, nous devons choisir une autre longueur de section et parcourir tout le fichier, ce qui est un moyen de ralentir.

Une solution serait de créer une sorte de couche de mise en cache nous permettant de faire des appels (à temps constant) pour des données de différentes résolutions. Malheureusement, je ne sais pas comment mettre en place un tel cache d'une manière qui nous montre encore des valeurs aberrantes.

Avez-vous des conseils ou de la documentation sur les approches de ce genre de problème?

L'environnement est Microsoft .net mais cela ne devrait pas faire de différence puisqu'il s'agit d'idées générales.

Merci d'avance.

Répondre

2

Mon approche serait de stocker les données dans plusieurs fichiers, comme ceci:

  • Ajoutez la {horodatage, valeur} au fichier [0].
  • pour i = 0 ... MAX_REASONABLE:
    • si FICHIER [i] comptage de l'échantillon modulo ZOOM est différent de zéro, la sortie. Obtenir les derniers échantillons ZOOM à partir de FILE [i].
    • les compresser en un seul échantillon (par exemple, les horodatages moyens? Obtenir minimum?) et les données d'échantillon moyennes.
    • si FICHIER [i + 1] n'existe pas, créez-le.
    • écrire l'échantillon nouvellement créé au fichier [i + 1]

La quantité totale de données converge vers SIZE * (1/(1- (1/ZOOM))) - vous avez besoin 100 % d'espace supplémentaire si ZOOM = 2, et seulement 33% si ZOOM = 4, et ainsi de suite. Lorsque vous visualisez, vous choisissez rapidement le niveau le plus proche à afficher. Supposons que vous deviez visualiser 800 pixels à partir d'une plage contenant 600 000 échantillons, avec ZOOM = 2; alors le logarithme de 600.000/800 divisé par le logarithme de ZOOM donne 9.55, ce qui signifie que vous devez accéder au niveau de zoom 9.

Ce fichier est zoomé ZOOM^9 = 512 fois, ie vous lirez 600.000/512 = 1171 échantillons et rééchantillonner l'image 1171 x H à 800 pixels de largeur.

Les coûts d'écriture totaux augmenteront d'au plus 300% en moyenne; les besoins totaux de stockage augmenteront d'au plus 100%; Pour générer une image, votre coût devient plus ou moins constant, en fonction de la largeur de l'image que vous générez. J'ai travaillé sur de tels systèmes pour le rendu de cartes, et il est possible d'afficher une zone rectangulaire à partir d'une carte terapixel avec un panoramique et un zoom en temps réel (sauf pour le débit et la latence du réseau). qualité).

+0

Merci. La réponse a été très utile. Nous avons finalement accepté de l'appliquer de cette façon. –

Questions connexes