Cykliczne wykonywanie tych samych obliczeń na zaktualizowanych danych

0

Problem dotyczy TEJ aplikacji.

Stworzyłem sobie kalkulator do liczenia ROI (zwrot z inwestycji, wzór: d2/d1-1). Działa przy inicjalizacji bazy, przy aktualizacji, ale dotyczy zwrotu względem poprzedniego dnia. Teraz chciałbym to przedstawiać w określonym zakresie, powiedzmy ostatni tydzień, miesiąc, trzy miesiące, pół roku, rok, 3 lata itd. Na ten moment chciałbym mieć dwie opcje.

  1. ROI z wybranego zakresu. Czyli pomiędzy najnowszym dniem, a np. tym co było rok temu (już pomijam kwestię jaką logikę przyjąć co ma być tym rokiem bo to też jest jakiś tam problem do przemyślenia).
  2. Średnie arytmetyczne ROI w wybranym zakresie.

Przyjąłem więc, że stworzę sobie obiekt, który dla każdego z aktywów będzie trzymał te wyliczone dane w bazie i przy okazji aktualizacji wartości będą codziennie przeliczane. W przypadku punktu 1 to jeszcze dałoby się zrobić. Jeżeli mam 1000 obiektów z 6 repozytoriów i dla każdego potrzebuje dane najnowsze oraz dajmy na to 5 historycznych to musiałbym się trochę nagimnastykować z zapytaniami, ale dałoby radę.

Jednak jeżeli bym chciał liczyć wartości średnie czy inne miary statystyczne to pojawia się problem bo dla 5 lat tych danych będzie sporo, a obliczeń jeszcze więcej. Gdybym nie korzystał z darmowego AWS, który jeżeli się nie mylę ma 1GB pamięci to może by nie było problemu, ale już raz zbudowałem sobie klasę do aktualizacji, który ładował wszystkie dane historyczne oraz nowe, a następnie szukał różnic, która nie wytrzymała zderzenia z taką małą ilością pamięci. Dlatego wolę się spytać jak takie problemy się normalnie rozwiązuje bo takich cyklicznych przeliczeń zapewne wykonuje się w wielu branżach. Kiedyś jak szukałem to znalazłem Speedment, ale nie wiem czy to jest to czego potrzebuje i czy kierunek właściwy.

Ewentualnie teraz przyszło mi do głowy żeby przerzucić przeliczenia na bazę danych.

0

Mogę się mylić, ale dla mnie, punkt 1. i 2. to dokładnie to samo. Jak jedziesz z Gdańska do Krakowa z różną prędkością i chcesz obliczyć średnią, to czy sumujesz wszystkie prędkości i liczysz ich średnią? Nie - bierzesz całkowita droga przez czas i tyle. Wydaje mi się że tutaj jest analogiczna sytuacja

0

nie przeliczaj nigdy na bazie danych - zaboli cię podczas migracji z bazy. poczytaj proszę o hadoopie i casandrze oraz o mapreduce: https://docs.microsoft.com/pl-pl/azure/hdinsight/hadoop/apache-hadoop-develop-deploy-java-mapreduce-linux

1

IMO jeśli chcesz sobie na żądanie przeliczać takie agregacje, to zainteresowałbym się Sparkiem. Trzymasz dane partycjonowane po dniu i agregujesz. Taki SQL na sterydach. Zapytanie będzie trwało w zależności od liczby zaangażowanych partycji.

Jeśli natomiast to ma być jakiś interaktywny GUI, to wtedy sprawa się komplikuje i trzeba by w bazie trzymać gotowe agregaty per rok, miesiąc i dzień

1 użytkowników online, w tym zalogowanych: 0, gości: 1