Charting riesige Mengen von Daten
Sind wir derzeit mit ZedGraph und zeichnen Sie eine Linie Diagramm der Daten. Die input-Daten von einer Datei beliebiger Größe, daher wir nicht wissen, was die maximale Anzahl der Datenpunkte im Voraus. Jedoch, indem Sie die Datei öffnen und Lesen der header, können wir herausfinden, wie viele Datenpunkte sind in der Datei.
Das format der Datei ist im wesentlichen [Zeit (Doppel -), Wert (double)]. Allerdings werden die Einträge nicht einheitlich in der Zeit-Achse. Es kann nicht sein, alle Punkte, die zwischen, sagen wir t = 0 s und t = 10 sec, aber es könnte sein, 100K Einträge zwischen t = 10 s und t = 11 s und so weiter.
Als Beispiel, unsere test-dataset Datei ist ~2,6 GB und es hat 324 Punkte. Wir möchten zeigen das gesamte Diagramm, um den Benutzer, und lassen Sie Sie navigieren durch das Diagramm. Jedoch, Belastung bis 324 Punkte zu ZedGraph ist nicht nur unmöglich (wir sind auf einem 32-bit-Maschine), aber auch nicht sinnvoll, da es keinen Punkt gibt, der mit so viele Punkte auf dem Bildschirm.
Mithilfe der FilteredPointList Funktion von ZedGraph erscheint auch nicht in Frage, denn das erfordert das laden der gesamten Daten zuerst und dann filtern von Daten.
So, es sei denn, wir verpassen nichts, es scheint, dass unsere einzige Lösung ist -irgendwie - dezimieren die Daten, aber wir arbeiten weiter daran, wir laufen in eine Menge Probleme:
1 - Wie wir dezimieren die Daten, die nicht ankommen, die gleichmäßig in der Zeit?
2 - Da die gesamten Daten können nicht in den Speicher geladen, jeder Algorithmus muss die Arbeit auf der Platte und so muss sorgfältig ausgelegt werden.
3 - Wie gehen wir mit Zoomen in und aus, vor allem, wenn die Daten nicht einheitlich auf der x-Achse.
Wenn die Daten gleichmäßig ist, nach anfänglichen laden der Grafik, wir könnten Seek()
durch vordefinierte Menge der Einträge in der Datei, und wählen Sie alle N anderen Proben und es zu versorgen, zu ZedGraph. Jedoch, da die Daten nicht einheitlich ist, müssen wir intelligenter bei der Auswahl der Proben auf dem display, und wir können nicht kommen mit einem intelligenten Algorithmus, der nicht die gesamte Datei zu Lesen.
Bitte ich zu entschuldigen, da die Frage nicht auf die gestochen scharfen Spezifität, aber ich hoffe, ich konnte erklären, die Art und den Umfang unserer problem.
Sind wir auf einer Windows-32-bit, .NET 4.0.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich gebraucht, bevor, und es ist nicht einfach zu tun. Landete ich Schreibe meine eigene Grafik-Komponente, da diese Anforderung. Es stellte sich heraus, besser am Ende, weil ich in all den Funktionen, die wir brauchten.
Grundsätzlich müssen Sie den Bereich der Daten (min und max möglich/nötig index-Werte), und eine Unterteilung in Segmente (sagen wir mal 100 Segmente), und bestimmen Sie dann einen Wert für jedes segment durch algorithmen (Mittelwert, median, etc.). Dann zeichnen Sie auf der Grundlage dieser zusammengefassten 100 Elemente. Dies ist viel schneller als der Versuch, die Handlung Millionen Punkte :-).
Also, was ich sage, ist ähnlich zu dem, was Sie sagen. Sie erwähnen Sie nicht zeichnen möchten jeden X-Elemente, denn es könnte eine lange Strecke von Zeit (index-Werte auf der x-Achse) zwischen den Elementen. Was ich sagen will ist, dass für jede Unterteilung der Daten festzustellen, was ist der beste Wert, und nehmen das als die Daten zeigen. Meine Methode ist der index-Wert basiert, also in deinem Beispiel keine Daten zwischen 0 Sek und 10 Sek index-Werte würde ich noch Daten Punkte gibt es, Sie würden nur die gleichen Werte unter sich.
Den Punkt, ist die Zusammenfassung der Daten, bevor Sie zeichnen Sie es. Denken Sie über Ihre algorithmen zu tun, dass Sie sorgfältig, es gibt viele Möglichkeiten, dies zu tun, wählen Sie die eine, die funktioniert für Ihre Anwendung.
Erhalten Sie möglicherweise Weg mit nicht, schreiben Sie Ihre eigene Grafik-Komponente, und schreiben Sie einfach die Daten-Verdichtung-Algorithmus.
Ich würde diesen Ansatz in zwei Schritten:
Schritt 1
Die Datei sollte vorverarbeitet werden in eine Binär-fest-format-Datei.
Einen index hinzufügen, um das format, es wäre int,double,double.
Lesen Sie diesen Artikel for speed Vergleiche:
http://www.codeproject.com/KB/files/fastbinaryfileinput.aspx
Dann können Sie entweder brechen die Datei in Zeitabständen, sagen
einen pro Stunde oder Tag, die Ihnen eine einfache Möglichkeit, um auszudrücken,
der Zugriff auf verschiedene Zeitintervalle. Man könnte auch einfach halten
eine große Datei und eine index-Datei, die Ihnen sagt, wo zu bestimmten Zeiten,
1,1/27/2011 8:30:00
13456,1/27/2011 9:30:00
Mithilfe einer dieser Methoden werden Sie in der Lage, schnell zu finden, jeden block von Daten
entweder durch Zeit, über eine index-oder Dateinamen eingeben, oder indem Sie die Anzahl der Einträge, durch die Feste byte
format.
Schritt 2
Möglichkeiten zum anzeigen von Daten
1. Nur die Anzeige jedes Datensatzes von index.
2. Normalisieren von Daten und erstellen von aggregierten Daten bars mit open, high, low ,close-Werte.
ein. Durch Die Zeit
b. Von Rekord zählen
c. Durch den Unterschied zwischen dem Wert
Weitere Möglichkeiten, um aggregierte nicht-einheitliche Daten-sets möchten Sie vielleicht zu schauen
können verschiedene Methoden verwendet werden, um aggregierte Daten über den Handel an den Finanzmärkten. Natürlich
für die Geschwindigkeit in Echtzeit-rendering Sie möchten, erstellen Sie Dateien mit diesen Daten bereits
aggregiert.
(Hinweis - ich gehe davon aus, dass Ihre loader-Datei ist im text-format.)
An einem ähnlichen Projekt, ich hatte zu Lesen, datafiles, das waren mehr als 5 GB groß. Nur so konnte ich analysieren, war durch das Lesen in eine RDBMS-Tabelle. Wir wählten MySQL, denn es macht das importieren von text-Dateien in Datentabellen drop-dead einfach. (Eine interessante Nebenbemerkung-ich war auf einem 32-bit-Windows-Maschine und konnte nicht öffnen Sie die text-Datei für die Anzeige, aber MySQL Lesen, ist es kein problem.) Der andere Vorteil war MySQL ist Schreien, Schreien schnell.
Sobald die Daten in der Datenbank könnten wir uns leicht Sortieren und zu quantifizieren, große Mengen von Daten in singular umformuliert Abfragen (mit dem integrierten SQL-Zusammenfassung Funktionen wie
SUM
). MySQL konnte sogar Lesen Sie die Abfrageergebnisse zurück, um eine Textdatei für die Verwendung als Lader-Daten.Lange Geschichte kurz, in Anspruch nehmen, dass viele Daten Mandate, die die Verwendung von einem tool, das zusammenfassen der Daten. MySQL passt die Rechnung (pun intended...es ist kostenlos).
Eine relativ einfache alternative, die ich gefunden habe, dies zu tun ist, um Folgendes zu tun:
Ich habe diesen Algorithmus in die Vergangenheit zu nehmen Datensätzen von ~10 Millionen Punkte nach unten, um die Reihenfolge der ~5K Punkte, ohne offensichtlich sichtbare Verzerrung der Grafik.
Die Idee hier ist, dass, während man dabei Punkte, du bist die Erhaltung der Gipfel und Täler, so dass die "signal" gesehen, in der letzten Grafik ist nicht "gemittelt nach unten" (in der Regel, wenn die Mittelwertbildung, sehen Sie die Gipfel und die Täler werden weniger prominent).
Der andere Vorteil ist, dass Sie immer zu sehen sind "echte" Datenpunkte auf das Endergebnis (es fehlen ein paar Punkte, aber die Punkte, die gibt es tatsächlich in der original-Datensatz, so dass, wenn Sie mit der Maus über etwas, können Sie zeigen die eigentlichen x & y-Werte, weil Sie echt sind, nicht gemittelt).
Schließlich, dies hilft auch mit dem problem, dass Sie nicht mit konsistente x-Achse den Abstand (wieder haben Sie real Punkte anstelle der Mittelwertbildung X-Achsen-Positionen).
Ich bin mir nicht sicher, wie gut sich dieser Ansatz funktionieren würde, w/100s von Millionen Datenpunkte, wie Sie haben, aber es könnte einen Versuch Wert sein.