Was wäre eine gute Datenstruktur in Java um Millisekunden Preisdaten zu speichern? Etwa 1.000.000 Elemente oder mehr im Container. Was ist der spezifische Container (Vektor, Array, Hash, usw.), der speziell dafür entworfen wurde, viele Daten zu speichern? Ich habe nicht die Absicht, die Daten zu filtern oder zu sortieren, aber ich brauche die Fähigkeit, einen Schlüssel (möglicherweise einen Krawattenstempel) zuzuweisen, um den entsprechenden Preis zu erhalten.Container oder Datenstruktur geeignet für die Speicherung von Millisekunden Daten
Antwort
Wenn Sie einen Wert (Preis) zu einem Schlüssel (Preis) zuweisen, sollten Sie eine Sammlung verwenden die Umsetzung der Map
Schnittstelle: TreeMap
, HashMap
, Hashtable
oder LinkedHashMap
. Sie finden eine Übersicht der Kollektionen here.
Wenn ein Schlüssel mehr als einen Wert haben kann, benötigen Sie eine Multimap, d. H. Eine Karte, deren Wert eine Sammlung ist (siehe Beispiel here).
Angenommen, es ist nicht der Fall, würde ich vorschlagen, eine TreeMap
, d. H. Eine Karte, wo Schlüssel sortiert sind. Hier ein Beispiel:
Map<Long, Double> priceHistory = new TreeMap<>();
ZonedDateTime zdt1 = ZonedDateTime.now();
ZonedDateTime zdt2 = ZonedDateTime.of(
LocalDate.of(2015,9,26),
LocalTime.of(11,10,9),
ZoneId.systemDefault());
priceHistory.put(zdt1.toInstant().toEpochMilli(), 10.5);
priceHistory.put(zdt2.toInstant().toEpochMilli(), 11.5);
Es soll kein Problem sein zu halten 1000000 Elemente, und es sollte schnell sein, den Preis für einen bestimmten Zeitstempel zu erhalten.
Sie brauchen wahrscheinlich nicht wirklich Millisekunde Präzision, Sie müssen nur etwas für eine beliebige Millisekunde erhalten. Guavas RangeMap
ist großartig dafür, Sie können ein RangeMap<LocalDateTime, Price>
konstruieren und es mit einem Wert pro Sekunde (zum Beispiel) mit Range.closedOpen(second, second.plusSeconds(1))
als Schlüssel bevölkern. Sie können dann .get()
auf einem beliebigen LocalDateTime
aufrufen und es wird den Wert zurückgeben, der dem Range
zugeordnet ist, der diese Zeit enthält. Sie erhalten eine willkürliche Lookup-Genauigkeit, verwenden aber nur so viel Speicherplatz, wie Sie möchten.
Wenn Sie wirklich Millisekunden-Präzision wünschen, werden Sie es schwer haben, mehr als ein paar Tage Daten effizient zu speichern. Stattdessen sollten Sie Ihre Daten in einer Datenbank speichern. Datenbanken wurden entwickelt, um große Datensätze effizient zu speichern und abzufragen, weit über das hinaus, wofür Standard-Datenstrukturen im Speicher gedacht sind.
- 1. Welche Datenstruktur ist für diese Situation geeignet?
- 2. Wann findet die erneute Speicherung für ungeordnete assoziative Container statt?
- 3. Die, im Finanzsektor, die Speicherung von Daten in Frage
- 4. Reduzierung der Redundanz in Daten für die Speicherung in MySQL
- 5. Speicherung großer, statischer Daten
- 6. Wie sorge ich am besten für die Speicherung historischer Daten?
- 7. Lebensdaueranforderungen für die Speicherung von std :: exception_ptr
- 8. Speicherung von Daten aus gespeicherten Prozeduren
- 9. Optimale Speicherung von XML-Daten in Marlogic
- 10. Was ist eine gute Datenstruktur für periodische oder wiederkehrende Daten?
- 11. MacRuby - ActiveRecord für die Speicherung?
- 12. Persistente Speicherung von verschlüsselten Daten mit. NET
- 13. Effiziente Speicherung von Primzahlen
- 14. Welche Datenstruktur wäre zur Lösung dieses Problems geeignet?
- 15. Django Speicherung anonyme Benutzer Daten
- 16. Ionic + Firebase redundante Speicherung von Daten
- 17. Datenstruktur für die Verzeichnisstruktur verwendet?
- 18. Datenstruktur für die Implementierung von Tabellenkalkulationen
- 19. Was ist die beste Strategie für die Speicherung großer Datenmengen?
- 20. Wer nutzt NoSQL-Datenbanken für die Speicherung von Krankenakten?
- 21. Der beste Ort für die Speicherung von Benutzeranmeldeinformationen in Android
- 22. Ist die Speicherung mit einer Datenbank oder Datei sicherer?
- 23. C# separate Klasse für die Speicherung
- 24. Ist Doc2Vec für die Stimmungsanalyse geeignet?
- 25. Adobe Interview: Welche Datenstruktur für die Speicherung von Tausenden von Punkten (x, y) verwendet, um bestimmte Operationen schneller durchzuführen
- 26. Ist hdf5 für Echtzeitmessungen geeignet?
- 27. Effiziente Datenstruktur für die Bestenliste
- 28. Ist Docker Compose für die Produktion geeignet?
- 29. Was ist die beste Datenstruktur (Container) für schnelles Einfügen/Löschen von Elementen nach Index?
- 30. WebApi & Odata - geeignet für die Dateiverwaltung?
Sie sollten 'double' nicht verwenden, um Preisdaten zu speichern. Fließkomma ist ungenau und kann nicht viele Werte genau darstellen. Darüber hinaus ist es unwahrscheinlich, dass Sie eine "ZonedDateTime" als Map-Schlüssel verwenden möchten, da sonst die entsprechenden Zeiten in anderen Zeitzonen nicht übereinstimmen. Verwenden Sie stattdessen "Instant", wenn Sie sich für Momente interessieren, oder "LocalDateTime", wenn Sie sich für Zeitstempel interessieren. "ZonedDateTime" sollte in der Regel nur für Benutzeranzeigen verwendet werden. – dimo414
Ich stimme dem Double zu (es ist nur ein Beispiel, im Idealfall wäre 'BigDecimal' am besten). Ich habe nicht ZoneDateTime als Schlüssel verwendet: Ich habe es in Instant konvertiert und dann die Millisekunden extrahiert, wie @alfred in seiner Frage angegeben hat. – joel314