• Nie Znaleziono Wyników

Rozdział 2. Algebra przetwarzania strumieniowego

2.7 Operatory okien

Zgodnie z definicją strumienie danych są nieograniczone w czasie. Przechowywanie wszystkich danych przekazywanych w strumieniu jest technicznie nie wykonalne. Aby operatory stanowe przechowywały ograniczoną liczbę krotek wprowadzono do strumieniowych baz danych operatory okien. Ich rolą jest ograniczenie okresu aktywności krotek, co prowadzi do zmniejszenia liczby krotek w tabeli historii. Okna dzielimy na dwie grupy. Okna czasowe, które definiują czas życia krotki w oparciu o wartości znaczników czasu. Przyjmijmy, że chcemy wyliczać

średnią szybkość samochodów, które pojawiły się na pewnym odcinku drogi w przeciągu ostatniej godziny. Na badanej drodze zainstalowano czujnik rejestrujący szybkość pojazdu oraz czas pomiaru. Wyznaczenie wartości średniej wymaga zastosowania okna czasowego, które każdej krotce t ustawia wartość t.te = t.ts + 1 godzina. W konsekwencji pomiar t będzie uwzględniany w agregatach przez następną godzinę. Omówiony operator w literaturze nazwano oknem czasowo-przesuwnym. Do drugiej grupy operatorów zaliczamy okna fizyczne. Operatory te definiują ograniczenia czasu życia krotek, korzystając z innych własności niż tylko znaczniki czasu. Powracając do przykładu drogowego. Tym razem chcemy wyznaczyć średnią szybkość n ostatnich samochodów na wskazanym odcinku drogi. W tym celu należy stworzyć bufor n elementowy. Jeżeli na wejściu pojawi się nowa krotka a bufor jest wypełniony, wpierw dezaktualizowana jest najstarsza krotka przy użyciu krotki negatywnej. Następnie na wyjście przekazywana jest nowa krotka. Opisane okno w literaturze nazwano liczebnościowym. Tablica historii zasilona przez takie okno będzie zawierała, co najwyżej n aktywnych krotek.

Podsumowując, okna czasowe pozwalają skrócić czas życia krotek, w konsekwencji operatory stanowe zasilane takimi strumieniami mają mniejsze wymagania pamięciowe. Z drugiej strony okno czasowe nie determinuje liczby krotek aktywnych w tabeli historii, ponieważ liczba elementów zależy od intensywności strumienia. W konsekwencji okna czasowe nie gwarantują, że rozmiar kolekcji lokalnej operatora nie przekroczy zadanego limitu. Okna fizyczne pozwalają na sztywne ograniczenie rozmiaru kolekcji lokalnych. W przypadku okna liczebnościowego, bezpośrednio ograniczamy liczbę krotek aktywnych w dowolnym momencie czasu. Stosując okna fizyczne należy być świadom pewnego specyficznego procesu. Przyjmijmy, że w strumieniu znajduje się m krotek z tymi samymi znacznikami &'. Okno liczebnościowe ma rozmiar n. Jeżeli b > d, wtedy część krotek temporalnych z identycznymi wartościami &' zostanie usunięta przez krotkę

negatywną posiadającą &( = &'. Prowadzi to do powstania krotek o zerowym czasie

życia. Z punktu widzenia logiki temporalnej [55] są one elementami neutralnymi, ponieważ krotka o zerowym czasie życia nie może być źródłem krotki o niezerowym czasie życia. Rozważmy zapytanie, składające się z połączonych kaskadowo dwóch operatorów zasilanych różnymi oknami liczebnościowymi. Okna liczebnościowe zliczają wszystkie krotki zarówno o zerowym jak i niezerowym czasie życia.

W konsekwencji krotki o zerowym czasie życia nie są elementami neutralnymi dla powyższego zapytania. Istnienie tego zjawiska nie zakłóca przetwarzania strumieniowego, ponieważ operatory nadal przetwarzają strumienie w sposób deterministyczny. W razie konieczności najbezpieczniejszym rozwiązaniem jest zdefiniowanie operatora tak, aby nie generował krotek o zerowym czasie życia. Przykładowo, gdy wartość znacznika czasu krotki do usunięcia jest równa znacznikowi czasu krotki przybyłej kolekcja jest tylko rozszerzana o nowy element. Dopiero po nadejściu krotki z większym znacznikiem czasu, z kolekcji wymiatane są krotki w celu ograniczenia rozmiaru bufora do n elementów.

2.7.1 Okno przesuwno-czasowe

Operator logiczny definiujemy:

efd-gfh i4 = {[&', &'+ 8, +, |[&', &(,  ∈ 4} (2.9) Operatora ten iteruje po wszystkich elementach tabeli historii H. Jeżeli na wejściu jest krotka temporalna, wtedy na wyjście jest generowana krotka o identycznych wartościach atrybutów e ale o czasie życia 8. Jeżeli na wejściu pojawi się krotka negatywna jest ona usuwana, ponieważ każda krotka ma czas życia równy 8 . Dodatkowo krotka graniczna jest przekazywana niezmieniona z wejścia na wyjście.

Operator ten jest bezstanowy, dzięki czemu zachodzi niezmiennik stanu. Niezmiennik propagacji jest zachowany, ponieważ krotki temporalne oraz graniczne są przekazywane na wyjście zgodnie z porządkiem leksykograficzny. Niezmiennik przejścia jest osiągany, ponieważ operator ten jest bezstanowy.

Zauważmy, że kiedy każda krotka ma ten sam czas życia, kolejność krotek uporządkowanych ze względu na &' jest identyczna z uporządkowaniem względem &(.

Powyższa własność sprawia, że strumień wynikowy tego operatora jest najsłabiej nie monotoniczny niezależnie od typu monotoniczności strumienia wejściowego.

2.7.2 Okno stało-czasowe

Operator logiczny definiujemy:

efdjfk hi4 = l [&', d + 1 ∙ 8, |

[&', &(,  ∈ 4 ∧ &'≥ d ∙ 8 ∧ &' < d + 1 ∙ 8p (2.10) gdzie n jest liczbą całkowitą.

Przyjmijmy, że chcemy zmierzyć liczbę zgłoszeń na aukcji w kolejnych godzinach: 12:00, 13:00, 14:00, …, 24:00. W takim zapytaniu istnieją z góry narzucone interwały naliczania agregatów sumy, stąd pochodzi nazwa okno stało-czasowe. Niezależnie czy krotka przybyła o godzinie 12:15, 12:19 czy 12:50 jej nowy czas życia będzie kończył się o 13:00.

Implementacja tego operatora wyróżnia dwa przypadki. Jeżeli na wejściu jest krotka temporalna, wtedy na wyjście jest generowana krotka z czasem życia [&', d + 1 ∙ 8 i identyczną wartością atrybutów e; z kolei krotki negatywne są usuwane. Dodatkowo krotka graniczna jest przekazywana niezmieniona z wejścia na wyjście. Weryfikacja niezmienników dla tego operatora jest taka sama jak dla operatora okna przesuwno-czasowego.

Zauważmy, że operator ten przekazuje na wyjście krotki w takiej kolejności, jakiej napłynęły. Ponadto wartości kolejnych znaczników &( tworzą niemalejący ciąg

wartości. Powyższe własności oznaczają, że strumień wynikowy okna stało-czasowego jest typu najsłabiej nie monotonicznego.

2.7.3 Okno liczebnościowe

Okno liczebnościowe winCntn(S) ogranicza rozmiar tabeli historii do n

aktywnych elementów. Definicję tego operatora przedstawia alg. 2.1.

Implementacja operatora korzysta z kolejki FIFI buf. Przetwarzanie krotki temporalnej t rozpoczyna się od utworzenia krotki tnew, która w odróżnieniu do krotki

t posiada czas życia zdefiniowany jako nieskończony. Jeżeli czas życia krotek

wynikowych nie zostałby ustawiony na nieskończoność, wtedy liczba elementów byłaby mniejsza od n, gdy czas życia krotki upłynąłby zanim nowa krotka napłynęłaby do systemu.

Algorytm 2.1. Algorytm okna liczebnościowego.

Process(Tuple t) 1)if t jest temporalna

2) utwórz krotkę tnew = ([t.ts, MAX_VALUE), t.e)

3) if n == buf.size()

4) usuń pierwszą krotkę z buf i zapisz ją w zmiennej tr

5) utwórz negatywną krotkę tn = ([t.ts, t.ts), tr.e)

6) dodaj tn do OUT

7) dodaj tnew na koniec buf

8) dodaj tnew do OUT

9)if t jest typu Boundary

10) dodaj t do OUT

Operator ten jest zgodny z niezmiennikiem stanu, ponieważ przechowuje tylko n ostatnich krotek strumienia. Niezmiennik przejścia jest spełniony, ponieważ wystarczy znajomość n ostatnich krotek z wejścia, aby wyznaczyć wynik po przetworzeniu bieżącej krotki t. Niezmiennik propagacji jest zachowany, ponieważ krotki temporalne i krotki graniczne są uporządkowane zgodnie z porządkiem leksykograficznym.

Strumień wynikowy okna liczebnościowego posiada zarówno krotki temporalne jak i negatywne. Oznacza to, że strumień wynikowy jest mocno nie monotoniczny i własność ta nie zależy od monotoniczności typu strumienia zasilającego.