Performate Zeiteiteiteilungs- Berechnung

PollerJava

Top Contributor
Hallo,

ich habe folgenden Code unten. Diese Zeiteinteilung pro Woche gehört zu einem User. Ich möchte nun alle halbe Stunden nachschaun ob dieser da ist, z.B.:

27.09.2015: 08:00 - 13:00

start immer bei 07:00 und ende immer um 19:00

07:00 - 07:30 nicht da -> 0
07:30 - 08:00 nicht da -> 0
08:00 - 08:30 da -> 1
08:30 - 09:00 da -> 1
09:30 - 10:00 da -> 1
...
13:00 - 13:30 nicht da -> 0

sowas soll dann rauskommen nur für diesen User:

0 0 0 0 1 1 1 ... 1 0 0 0 1 1 1 0 ...

für andere User kommt auch sowas raus und diese möchte ich dann zusammenzählen.

Meine Frage wäre jetzt, wie ich das performant lösen könnte.
wenn ich da mit einer for- Schleife über alle Intervall darüber iteriere, braucht das ja einigermaßen, da ich bis zu 1000 solcher SchedulerContainers haben kann (z.B. 80 User mit je 12 Terminen = 960 SchedulerContainers).

Ich verwende übrigens JodaTime aber ich hab noch keine Mögl



Java:
final List<List<SchedulerContainer>> weekScheduler = new ArrayList<>();

        weekScheduler.add(0, new ArrayList<SchedulerContainer>()); // day 1 of week
        weekScheduler.add(1, new ArrayList<SchedulerContainer>()); // day 2 of week
        weekScheduler.add(2, new ArrayList<SchedulerContainer>()); // day 3 of week
        weekScheduler.add(3, new ArrayList<SchedulerContainer>()); // day 4 of week
        weekScheduler.add(4, new ArrayList<SchedulerContainer>()); // day 5 of week
        weekScheduler.add(5, new ArrayList<SchedulerContainer>()); // day 6 of week
        weekScheduler.add(6, new ArrayList<SchedulerContainer>()); // day 7 of week

        final SchedulerContainer sc1 = new SchedulerContainer();
        sc1.setStart(formatter.parseDateTime("27.09.2015 08:00"));
        sc1.setEnd(formatter.parseDateTime("27.09.2015 13:00"));
        sc1.setContainerType(SchedulerContainerTypeEnum.SERVICE);
        sc1.setRepeatable(true);

        weekScheduler.get(1).add(sc1);

        final SchedulerContainer sc2 = new SchedulerContainer();
        sc2.setStart(formatter.parseDateTime("29.09.2015 11:00"));
        sc2.setEnd(formatter.parseDateTime("29.09.2015 17:00"));
        sc2.setContainerType(SchedulerContainerTypeEnum.SERVICE);
        sc2.setRepeatable(true);

        weekScheduler.get(3).add(sc1);
 
denkst du das oder weisst du das dass es inperformant ist ? Mir scheint das jetzt kein so grosses Problem über 1000 Container zu iterieren ?!
 
Selbst wenn die Daten nicht im RAM sind, was sind denn bitte 1000 Zeilen aus einer Datenbank? Ich hab grade ne Anfrage offen. Oracle meint 126 Zeilen in 0,218 Sekunden. Allerdings ist das keine lokale Datenbank...
 
Der Post ist unklar und wenig informativ formuliert. Es wird nicht deutlich ob es eine Annahme ist das es nicht schnell genug läuft oder es sich um einen bestätigten Fakt handelt (vernünftiger Benchmark mit z.B. JMH), dass genau das Iterieren und Zusammenzählen (ohne Latenz durch das Netzwerk etc.) lange dauert.

Soweit ich das verstanden habe kann jeder Tag nur 12 Stunden haben der dann in 24 halbe Stunden zerlegt und als eine Reihe von 0,1 je Person verwaltet wird. D.h. es hat die Form 000000000000000000000000 mit der ersten Stelle interpretiert als 7 und der letzten Stelle interpretiert als 19 Uhr. Anwesenheiten einer Person in halbstündiger Auflösung werden dann mit 1 markiert.

Und dann soll irgendetwas zusammengezählt werden. Nur was genau soll gezählt werden? Angenommen es gibt zwei Nutzer die für den selben Tag folgende Ausprägungen haben.

U1: 001110000000000000000000
U2: 000011100000000000000000

Welche Fragen sollen gestellt werden? Die Anzahl der halben Stunden pro Nutzer? Die Anzahl aller halben Stunden über alle Nutzer? Die Anzahl der halben Stunden in denen sich alle Nutzer überdecken/nicht überdecken? Die Anzahl der halben Stunden über alle Nutzer je Klasse?

Dieses Datenmodell lässt sich natürlich sehr speichereffizient behandeln wenn man die 0,1 als Bits auffasst und z.B. mit bitweisen Operatoren blockweise (z.B. als int) bearbeitet. Das schont den Speicher extrem und für bestimmte Fragen ist auch eine effiziente Auswertung möglich. Aber ob dieses Modell überhaupt das Richtige für das Problem ist und ob nicht ein anderes Modell oder eine Kombination aus verschiedenen Ansätzen besser wäre, dafür fehlen einfach Informationen.
 

Zurück
Oben