W porządku, więc to jest nieco oddalone od innych odpowiedzi, ale ... wydaje mi się, że jeśli masz dane w systemie plików (być może jeden zapas na plik) ze stałym rozmiarem rekordu, możesz uzyskać dane naprawdę łatwo: mając zapytanie o określony czas i zakres czasowy, możesz znaleźć odpowiednie miejsce, pobrać wszystkie potrzebne dane (będziesz dokładnie wiedzieć, ile bajtów), przekształcić dane w wymagany format (co może bądź bardzo szybki w zależności od formatu przechowywania) i jesteś daleko.
Nie wiem nic o pamięci masowej Amazon, ale jeśli nie masz bezpośredniego dostępu do plików, możesz w zasadzie mieć bloby - musiałbyś zrównoważyć duże obiekty blob (mniej rekordów, ale prawdopodobnie odczytuje więcej danych niż potrzebujesz każdego time) z małymi obiektami blob (więcej rekordów oznacza więcej narzutów i prawdopodobnie więcej żądań ich uzyskania, ale za każdym razem zwracanych jest mniej bezużytecznych danych).
Następnie dodajesz buforowanie - sugerowałbym na przykład udostępnienie różnym serwerom różnych zasobów do obsługi - i możesz po prostu obsługiwać z pamięci. Jeśli możesz sobie pozwolić na wystarczającą ilość pamięci na wystarczającej liczbie serwerów, pomiń część „obciążenie na żądanie” i po prostu załaduj wszystkie pliki podczas uruchamiania. Uprościłoby to sprawę kosztem wolniejszego uruchamiania (co oczywiście wpływa na przełączanie awaryjne, chyba że możesz sobie pozwolić na zawsze posiadanie dwóch serwerów dla dowolnego konkretnego magazynu, co byłoby pomocne).
Pamiętaj, że nie musisz przechowywać symbolu giełdowego, daty ani minuty dla każdego rekordu - ponieważ są one niejawne w ładowanym pliku i pozycji w pliku. Powinieneś także rozważyć, jakiej dokładności potrzebujesz dla każdej wartości i jak ją efektywnie przechowywać - w swoim pytaniu podałeś 6SF, który możesz zapisać w 20 bitach. Potencjalnie przechowuj trzy 20-bitowe liczby całkowite w 64 bitach pamięci: przeczytaj je jako long
(lub cokolwiek będzie to twoja 64-bitowa wartość całkowita) i użyj maskowania / przesuwania, aby przywrócić ją do trzech liczb całkowitych. Będziesz oczywiście musiał wiedzieć, jakiej skali użyć - którą prawdopodobnie możesz zakodować w wolnych 4 bitach, jeśli nie możesz jej ustawić jako stałej.
Nie powiedziałeś, jak wyglądają pozostałe trzy kolumny z liczbami całkowitymi, ale jeśli udałoby ci się uciec z 64 bitami również dla tych trzech, możesz zapisać cały rekord w 16 bajtach. To tylko ~ 110 GB dla całej bazy danych, czyli niewiele ...
EDYCJA: Inną rzeczą do rozważenia jest to, że prawdopodobnie akcje nie zmieniają się w ciągu weekendu - a nawet z dnia na dzień. Jeśli giełda jest otwarta tylko 8 godzin dziennie, 5 dni w tygodniu, potrzebujesz tylko 40 wartości tygodniowo zamiast 168. W tym momencie możesz mieć tylko około 28 GB danych w swoich plikach ... co brzmi dużo mniejszy niż początkowo sądziłeś. Posiadanie takiej ilości danych w pamięci jest bardzo rozsądne.
EDYCJA: Myślę, że przegapiłem wyjaśnienie, dlaczego to podejście jest dobre tutaj: masz bardzo przewidywalny aspekt dla dużej części danych - indeks giełdowy, data i godzina. Wyrażając raz znacznik (jako nazwę pliku) i pozostawiając datę / godzinę całkowicie niejawną w pozycji danych, usuwasz całą masę pracy. To trochę jak różnica między a String[]
i a Map<Integer, String>
- świadomość, że indeks tablicy zawsze zaczyna się od 0 i rośnie w przyrostach o 1 do długości tablicy, pozwala na szybki dostęp i bardziej wydajne przechowywanie.