Okay, das ist etwas anders als bei den anderen Antworten, aber ... es fühlt sich für mich so an, als ob Sie die Daten in einem Dateisystem (vielleicht ein Bestand pro Datei) mit einer festen Datensatzgröße haben und an die Daten gelangen können ganz einfach: Wenn Sie eine Abfrage für einen bestimmten Bestand und einen bestimmten Zeitraum haben, können Sie an der richtigen Stelle suchen, alle benötigten Daten abrufen (Sie wissen genau, wie viele Bytes Sie haben) und die Daten in das gewünschte Format umwandeln (was möglich ist) Seien Sie sehr schnell, abhängig von Ihrem Speicherformat) und Sie sind weg.
Ich weiß nichts über Amazon-Speicher, aber wenn Sie keinen direkten Dateizugriff haben, könnten Sie grundsätzlich Blobs haben - Sie müssten große Blobs ausgleichen (weniger Datensätze, aber wahrscheinlich mehr Daten lesen, als Sie jeweils benötigen Zeit) mit kleinen Blobs (mehr Datensätze, die mehr Overhead verursachen und wahrscheinlich mehr Anfragen, um sie zu erreichen, aber jedes Mal weniger nutzlose Daten).
Als nächstes fügen Sie Caching hinzu - ich würde beispielsweise vorschlagen, verschiedenen Servern unterschiedliche Bestände zuzuweisen - und Sie können so ziemlich nur aus dem Speicher dienen. Wenn Sie sich genügend Speicher auf genügend Servern leisten können, umgehen Sie den Teil "Load on Demand" und laden Sie einfach alle Dateien beim Start. Dies würde die Dinge auf Kosten eines langsameren Starts vereinfachen (was sich offensichtlich auf das Failover auswirkt, es sei denn, Sie können es sich leisten, immer zwei Server für einen bestimmten Bestand zu haben, was hilfreich wäre).
Beachten Sie, dass Sie das Aktiensymbol, das Datum oder die Minute nicht für jeden Datensatz speichern müssen, da diese in der zu ladenden Datei und der Position in der Datei enthalten sind. Sie sollten auch überlegen, welche Genauigkeit Sie für jeden Wert benötigen und wie Sie diese effizient speichern können. Sie haben in Ihrer Frage 6SF angegeben, die Sie in 20 Bit speichern können. Speichern Sie möglicherweise drei 20-Bit-Ganzzahlen in 64-Bit-Speicher: Lesen Sie sie als long
(oder wie auch immer Ihr 64-Bit-Ganzzahlwert lautet ) und verwenden Sie Maskierung / Verschiebung, um sie auf drei Ganzzahlen zurückzusetzen. Sie müssen natürlich wissen, welche Skalierung Sie verwenden sollen - die Sie wahrscheinlich in die freien 4 Bits codieren könnten, wenn Sie sie nicht konstant machen können.
Sie haben nicht gesagt, wie die anderen drei Ganzzahlspalten aussehen, aber wenn Sie auch für diese drei mit 64 Bit davonkommen könnten, könnten Sie einen ganzen Datensatz in 16 Bytes speichern. Das sind nur ~ 110 GB für die gesamte Datenbank, was nicht wirklich viel ist ...
EDIT: Die andere zu berücksichtigende Sache ist, dass sich die Aktie vermutlich am Wochenende - oder sogar über Nacht - nicht ändert. Wenn die Börse nur 8 Stunden pro Tag, 5 Tage pro Woche geöffnet ist, benötigen Sie nur 40 Werte pro Woche anstelle von 168. Zu diesem Zeitpunkt könnten Sie nur noch etwa 28 GB Daten in Ihren Dateien haben ... was sich anhört viel kleiner als Sie wahrscheinlich ursprünglich gedacht hatten. Es ist sehr vernünftig , so viele Daten im Speicher zu haben .
EDIT: Ich denke, ich habe die Erklärung verpasst, warum dieser Ansatz hier gut passt: Sie haben einen sehr vorhersehbaren Aspekt für einen großen Teil Ihrer Daten - den Börsenticker, das Datum und die Uhrzeit. Indem Sie den Ticker einmal (als Dateinamen) ausdrücken und das Datum / die Uhrzeit vollständig in der Position der Daten implizieren , entfernen Sie eine ganze Reihe von Arbeiten. Es ist ein bisschen wie der Unterschied zwischen a String[]
und a Map<Integer, String>
- zu wissen, dass Ihr Array-Index immer bei 0 beginnt und in Schritten von 1 bis zur Länge des Arrays ansteigt, ermöglicht einen schnellen Zugriff und eine effizientere Speicherung.