2013-06-07 10 views
5

Ich bin neu in Java, also bin ich mir nicht sicher, welche Wahl der Datenstruktur hier gut wäre. Ich werde Akzelerometer-, Gyroskop- und Magnetometerdaten (9 Werte) in einer Liste speichern, um sie später zum Glätten, Anzeigen und zur Signalverarbeitung zu verwenden.Welche Datenstruktur ist für Zeitreihendaten in Java sinnvoll?

Meine Idee ist es, ein Objekt MyObject zu erstellen, das zehn Mitglieder hat: Zeitstempel und die neun Orientierungs-/Bewegungswerte, alle schweben. Ich werde dann die Daten in einem ArrayList<MyObject> speichern. Ist es eine gute Idee oder habe ich etwas übersehen?

Die Liste enthält maximal 100k Werte.

+0

Gibt es die Möglichkeit des gleichzeitigen Zugriffs? – fge

+0

@fge Nein, alles wird in einem einzigen Thread ausgeführt. – Andreas

+0

Nun, eine ArrayList ist in Ordnung.Aber 100k-Werte sind ziemlich groß, schreibst du diese vor der Verarbeitung in den persistenten Speicher oder verarbeitest du sie während des Betriebs? – fge

Antwort

1

Verwenden Sie TreeMap für einen Start, um die Suchleistung zu verbessern.

TreeMap

Hinweis (in docs):

Diese Implementierung bietet garantierte log (n) Zeitkosten für die containsKey erhalten, setzen und Operationen entfernen.

+5

Wenn die Datenreihen der Reihe nach gespeichert werden, ist eine 'ArrayList' schneller ... – fge

+0

@fge Für n = 100k, n gegen log (n), log (n) = 5 und n = 100 000. Wenn ich gesucht habe für einen bestimmten Artikel und es war der letzte Artikel, den ich durch 100 000 Artikel suchen musste, um den letzten Artikel zu finden. Vielleicht könnte eine Hashmap der Attribute einen Index in ArrayList erzeugen, um einen 1-stufigen Array-Indexzugriff zu ermöglichen. Nicht sicher, wie eine sortierte Arraylist einen schnelleren Zugriff bieten könnte, wenn Sie den Index zu dem gesuchten Objekt nicht kennen? – Excalibur2000

+0

Lesen Sie die Kommentare: Er muss nicht auf die Daten in seinem Programm zugreifen, speichern Sie es nur, Verarbeitung wird später durchgeführt. Daher benötigt er eine "Fast-Insertion-Only" -Datenstruktur. 'TreeMap' ist dafür Overkill. – fge

0

Erstellen Sie Ihre eigene Klasse ist der richtige Weg zu gehen. Jetzt zum Speichern der Objekte dieser Klasse ...

Wenn Sie direkte Suche (z. B. "geben Sie mir das fünfte Objekt") auf die Objekte, sobald Sie alle haben, verwenden Sie eine ArrayList. Wenn Sie jedoch alle Objekte der Reihe nach durchlaufen, sollten Sie eine linked list verwenden.

Die Klasse ArrayList verwendet ein primitives Array, das nach Bedarf vergrößert wird, um die Elemente, die Sie hinzufügen, anzupassen. Wenn es seine interne Struktur vergrößert, muss es ein neues Array zuweisen und alle ursprünglichen Werte kopieren. Dies kann teuer sein (besonders bei 100K Elementen!). Sie können geben Sie eine anfängliche Größe, um es mehr Zeit zu geben, bevor es wachsen muss; Wenn Sie jedoch nicht so viel Speicherplatz benötigen, kann das interne Array der ArrayList einen großen Teil des Speichers verschwenden.

Das Hinzufügen von Elementen zu einer verknüpften Liste kostet praktisch nichts, weil "wachsen" nicht benötigt wird; Es fügt nur einen weiteren Knoten zur Liste hinzu. Aber Sie können Gegenstände nicht nach ihrem Index suchen. Sie müssten beim ersten Element beginnen und die Liste zu dem gewünschten Element durchlaufen.

0

Sie mögen vielleicht direkt an der Ausgabe der Daten mit einem Dateiausgabestrom betrachten, anstatt sie in einem gewissen Datenstruktur zu speichern:

output = new BufferedWriter(new FileWriter("output.csv")); 

while(dataSource.stillHasData()) 
    output.println(dataSource.getData().toString()); 

output.close(); 

Mit einem BufferedWriter stellt sicher, dass das Programm nicht warten muss für Festplattenschreibvorgänge werden ausgeführt, bevor sie die nächsten Daten aufnehmen können. Dies wäre also akzeptabel, um Live-Daten zu sammeln (normalerweise).

Sie sollten dann in der Datenklasse so etwas tun:

public String toString(){ 
    StringBuilder buf = new StringBuilder(); 

    buf.append(timeStamp); str.append(','); 
    // ... 
    // append all the other data 

    return buf.toString(); 
} 

diese Weise ist es Vorteil hat, zu tun, die Sie dann in Programmen wie Excel importieren können oder wirklich fast jedes Programm, das Sie verwenden würden, um die Daten zu verarbeiten.

Verwandte Themen