Jeśli chcesz utrzymywać zużycie pamięci na stałym poziomie, ponieważ otrzymujesz coraz więcej danych, będziesz musiał (a) w jakiś sposób uzyskać resample. Oznacza to, że musisz zastosować jakiś schemat rebinning. Możesz poczekać, aż zdobędziesz pewną ilość surowych danych wejściowych przed rozpoczęciem ponownego łączenia, ale nie możesz tego całkowicie uniknąć.
Twoje pytanie naprawdę pyta "jaki jest najlepszy sposób dynamicznego dzielenia moich danych"? Istnieje wiele podejść, ale jeśli chcesz zminimalizować swoje założenia dotyczące zakresu lub rozkładu wartości, jakie możesz otrzymać, to prostym podejściem jest uśrednienie nad wiaderkami o stałym rozmiarze k, z logarytmicznie rozłożonymi szerokościami. Na przykład powiedzmy, że chcesz jednocześnie przechowywać 1000 wartości w pamięci. Wybierz rozmiar dla k, powiedz 100. Wybierz minimalną rozdzielczość, powiedz 1ms. Następnie
- Pierwsze wiadro zajmuje się wartości między 0-1ms (width = 1ms)
- Second wieloczynnościowy: 1-3ms (W = 2ms)
- Trzeciego wiadra: 3-7ms (w = 4ms)
- Fourth wieloczynnościowy: 7-15ms (w = 8ms)
- ...
- dziesiątego wieloczynnościowy: 511-1023ms (w = 512ms)
Ten typPodejściejest podobne do systemów chunkingowych użytych w hash table algorithms, używanych przez niektóre systemy plików i algorytmy alokacji pamięci. Działa dobrze, gdy dane mają duży zakres dynamiki.
W miarę pojawiania się nowych wartości można wybrać sposób ponownego próbkowania, w zależności od wymagań. Na przykład możesz śledzić numer moving average, użyć first-in-first-out lub innej, bardziej wyrafinowanej metody.Zobacz algorytm Kademlia dla jednego podejścia (używane przez Bittorrent).
Ostatecznie ponowne łączenie może spowodować utratę pewnych informacji. Twoje wybory dotyczące binningu będą określać, jakie informacje są tracone. Innym sposobem na powiedzenie tego jest to, że pamięć pamięci o stałym rozmiarze oznacza kompromis między dynamic range i sampling fidelity; jak sprawić, żeby ten kompromis należał do ciebie, ale jak każdy problem z próbkowaniem, nie ma ominięcia tego podstawowego faktu.
Jeśli naprawdę interesują Cię zalety i wady, żadna odpowiedź na tym forum nie może być wystarczająca. Powinieneś zajrzeć do sampling theory. Dostępnych jest ogromna ilość badań na ten temat.
Podsumowując, podejrzewam, że czasy serwera będą miały stosunkowo mały zakres dynamiki, więc bardziej swobodne skalowanie w celu umożliwienia częstszego pobierania wspólnych wartości może zapewnić dokładniejsze wyniki.
Edytuj: Aby odpowiedzieć na Twój komentarz, oto przykład prostego algorytmu binningowego.
- Przechowujesz 1000 wartości w 10 pojemnikach. Każdy pojemnik zawiera zatem 100 wartości. Załóżmy, że każdy bin jest zaimplementowany jako tablica dynamiczna ("lista", w terminach Perla lub Pythona).
Kiedy nowa wartość jest w:
- Określ, które bin powinien być przechowywany w oparciu o granicach bin już wybranych.
- Jeśli pojemnik nie jest pełny, dodaj jego wartość do listy pojemników.
- Jeśli pojemnik jest pełny, usuń wartość u góry listy pojemników i dodaj nową wartość na dole listy pojemników. Oznacza to, że stare wartości są z czasem odrzucane.
Aby znaleźć 90. percentyl, sortuj bin 10. 90. percentyl jest pierwszą wartością na posortowanej liście (element 900/1000).
Jeśli nie podoba ci się wyrzucanie starych wartości, możesz zamiast tego zastosować alternatywny schemat. Na przykład, gdy bin się zapełni (osiąga 100 wartości, w moim przykładzie), możesz wziąć średnią z najstarszych 50 elementów (tj. Pierwszych 50 na liście), odrzucić te elementy, a następnie dołączyć nowy średni element do kosz, pozostawiając ci pojemnik z 51 elementami, który ma teraz miejsce na 49 nowych wartości. Jest to prosty przykład ponownego łączenia.
Inny przykład ponownego łączenia to downsampling; na przykład wyrzucenie co piątej wartości na posortowanej liście.
Mam nadzieję, że ten konkretny przykład pomoże. Kluczem do zabrania jest to, że istnieje wiele sposobów na osiągnięcie stałego algorytmu starzenia się pamięci; tylko Ty możesz zdecydować, co jest zadowalające, biorąc pod uwagę Twoje wymagania.
Nie wiem. Ten algorytm zastępczy wydaje się wyraźnie wprowadzać odchylenie od starych danych. Właśnie dlatego naprawdę doceniłbym odpowiedni argument matematyczny co do solidności dowolnego rozwiązania. –
Jeśli dane na żywo są pobierane z jakiejś dystrybucji D, wówczas podpróbkowanie - bez podpróbkowania - również będzie pochodzić z D. Jeśli dane na żywo nie zostaną pobrane z jakiegoś rozkładu, wtedy lista percentyli może nie być najbardziej pouczającą rzeczą do szukać. – redtuna
Słowa kluczowe są pomocne .. Wyszukiwanie "kwantylu" i "strumienia" wywołuje różnego rodzaju badania na ten temat! Wszystkie techniki wydają się dużo bardziej zaangażowane niż którykolwiek z sugerowanych tutaj algorytmów. Dlatego jestem niezdecydowany, aby oznaczyć cokolwiek jako "odpowiedź". –