Posiadam urządzenie pomiarowe (podłączone do Maliny) które na wyjściu generuje ciąg zer i jedynek. Nie wnikając w istotę samej mierzonej wartości, Malina odczytuje stan wejścia 1 tys razy na sekundę. Pomiar polega na tym że co sekundę muszę policzyć ilość zer które wystąpiły w ciągu ostatnich 30 sekund. Stąd mam ciąg 30 tys bitów w którym co sekundę muszę policzyć ilość zer.
Ponieważ oczywiście karta SD nie zdzierży czegoś takiego, utworzyłem ramdisk (64 Mb) gdzie dane mogą być zapisywane z dużą prędkością bez wpisywania czegokolwiek dna SD.
Mam prośbę do Kolegów o radę. Chciałbym napisać program w Pythonie który policzy te zera, tylko kompletnie nie mam pomysłu na algorytm który by to obsłużył a Python by to "łynkął". Wydaje się że trzeba by utworzyć jakiś softwareowy rejestr przesuwający o długości 30 tys bitów i co sekundę liczyć ilość zer w tym rejestrze.
Czy Koledzy mają pomysł na coś takiego?

- Rejestracja:ponad 7 lat
- Ostatnio:ponad 2 lata
- Postów:44
0

lion137
Sa rozne algorytmy, niektore procesory maja do tego instrukcje. W czym to Masz w tablicy, w integerach?

Piotr Mackowiak
Na razie zliczam po prostu ilość zer jako liczbę. Tyle że oznacza to że dane pomiarowe są przez 30 sek takie same. A to nie jest docelowe rozwiązanie.
Tulio
A to nie wystarczy po prostu zapamiętywać dwóch rzeczy: ilości wystąpionych bitów oraz ich sumy? Liczba zer to: ilość bitów - suma (bo do sumy nie wliczą się zera). Chyba, że czegoś nie łapię :)

Piotr Mackowiak
Tak. I dokładnie tak w tej chwili robię. Zliczając ilość zer i po prostu dodając 1 lub nie do liczby. Tak robię 30 tys razy (czyli przez 30 sek) i w wyniku tego mam wynik pomiaru. Ale to oznacza że mam jeden pomiar co 30 sek. A ja chcę mieć pomiar co sekundę (czyli co 1 tys próbek) za ostatnie 30 sek (czyli 30 tys próbek).
Tulio
No ok, teraz by wystarczyło zrobić listę dwuwymiarową, gdzie każdym elementem listy była by tupla/lista posiadająca te dwie wartości: sumę z danej sekundy i ilość z danej sekudny. Pushujesz nową tuplę z tymi dwiema wartościami co jedną sekundę. Gdy ilość elementów będzie równa 31 zliczasz sumę wszystkich sum i ilości, a następnie popujesz pierwszy element.
- Rejestracja:prawie 19 lat
- Ostatnio:prawie 6 lat
- Lokalizacja:Lublin
0
Zrobiłem Ci program, który robi to co chcesz. Działa na tej zasadzie, że przechowuje listę:
[(ilośćSekunda1,sumaSekunda1),(ilośćSekunda2,sumaSekunda2),...,(ilośćSekunda30,sumaSekunda30)]
przy czym u mnie losuję wartości gdyż nie mam żadnego narzędzia do pomiaru
Gdy lista będzie miała więcej lub dokładnie 30 elemetnów to sumuję całą listę co do ilości i sum. Od ilości odejmuję sumę i mam ilość zer z ostatnich 30 sekund.
Następnie usuwam tylko pierwszy pomiar (czyli wszystkie z pierwszej sekundy) i tak mam ilość zer z kolejnych 30 sekund. Tak bez końca
[(ilośćSekunda1,sumaSekunda1),(ilośćSekunda2,sumaSekunda2),...,(ilośćSekunda30,sumaSekunda30)] -> Ilość zer z sekund 1-30
[(ilośćSekunda2,sumaSekunda2),(ilośćSekunda3,sumaSekunda3),...,(ilośćSekunda31,sumaSekunda31)] -> Ilość zer z sekund 2-31
[(ilośćSekunda3,sumaSekunda3),(ilośćSekunda4,sumaSekunda4),...,(ilośćSekunda32,sumaSekunda32)] -> Ilość zer z sekund 3-32
...
Kod:
from random import randint
from time import time
glownaListaProgramu = []
czas = time() # to do generatora bo nie pobieram z nikąd informacji tylko sobie losuję co 1/1000 sekundy
czas_sekunda = time()
suma = 0
ilosc = 0
while True:
teraz = time()
if len(glownaListaProgramu) >= 30: #Suma z każdych ostatnich 30 sekund
sumaIlosciOstatnie30Sekund, sumaWartosciOstatnie30Sekund = [sum(i) for i in zip(*glownaListaProgramu)]
iloscZerOstatnie30Sekund = sumaIlosciOstatnie30Sekund - sumaWartosciOstatnie30Sekund
print(iloscZerOstatnie30Sekund)
del glownaListaProgramu[0]
if teraz - czas_sekunda > 1: #operacje wykonywane co sekundę - zapisuję nową tuplę (wypadkową z ostatniej sekundy) do listy
glownaListaProgramu.append((ilosc,suma))
czas_sekunda = teraz
suma = 0
ilosc = 0
print(glownaListaProgramu) #zakomentuj tę linijkę jak nie chcesz widzieć tylu outputów co do listy dwuwymiarowej
continue
if 1000 * (teraz - czas) > 1: #generator wartości (losuję 0 lub 1 co 1/1000 sekundy). Ty tutaj pobierasz dane z miernika.
ilosc += 1
suma += randint(0,1)
czas = teraz
continue
edytowany 10x, ostatnio: Tulio

- Rejestracja:ponad 7 lat
- Ostatnio:ponad 2 lata
- Postów:44
0
Bardzo dziękuję Kolego ! Jak tylko wrócę do domu spróbuję !