Sziasztok!
Van egy rendszerem ahol minden órában létrehozunk egy forgalmi statisztikákat tartalmazó fájlt. Ezeket a fájlokat szinten óránként megvizsgaljuk kiugró méretváltozást keresve. Eddig ezt úgy csináltam, hogy lekérdeztem a fájlok méretét 10 napra visszamenőleg majd ezekből átlagot és standard szórást számoltam. Ha az új fájl méretének szórása nagyobb volt mint a 3x standard szórás akkor kaptunk egy figyelmeztetés.
Néhány napja viszont egy hibából kifolyólag 5x méretű fájlokat generáltunk néhány órán át. Ez hatalmasra növelte a standard szórást és lényegében a teszt nem működik. Szóval újra kell írnom.
Lényegében nem értek a statisztikához így a kérdésem az lenne, hogy milyen eljárást ajánlotok.
Mivel ez csak egy része egy komplett bash scriptnek szeretném bash-ban megvalósítani.
- 1887 megtekintés
Hozzászólások
Nézegetem a modified Thompson Tau tesztet. De bevallom nem értem a rejection region számítását. Pontosabban ha jól értem a Student t distribution egy táblázatból kell kinézni. Az én esetemben a szabadsági fok 1? Nem nagyon értem ezt a kifejezést.
- A hozzászóláshoz be kell jelentkezni
Oke ezt hoztam eddig ossze, de ez eleg _lassu_. Van valami optimalizacios otlet?
Old_sizes=`find /san/poptcsv/BEACON/zenpm/live/*${t}* -type f -mtime -10 -ls | awk '{print $7}' `
# We discard from the Old_sizes the outliner with modifiled Thomson Tau test, the new filtered Old_sizes will be $Old_sizes_filtered
Old_sizes_filtered=$Old_sizes
for Old_size in $Old_sizes; do
if [ $Change -eq '1' ]; then
# The number in the Old_sized_filtered
Old_amount=`echo $Old_sizes_filtered | wc -w`
# New mean calculate
let Sum=`echo $Old_sizes_filtered | sed 's/ /+/g' | bc -l`
let New_mean=`echo "scale=0; "$Sum/$Old_amount | bc -l`
#Calculate new standard deviation
DiffSum=0
for n in $Old_sizes_filtered; do
DiffSq=`echo "scale=3; ($n-$New_mean)*($n-$New_mean)" | bc -l`
DiffSum=`echo "scale=3; $DiffSum+$DiffSq" | bc -l`
done
Deviation=`echo "scale=3; sqrt($DiffSum/$Old_amount)" | bc -l`
fi
let Change=0
# The $Old_size deviation
Old_file_deviation=`echo "scale=3; sqrt(($Old_size-$New_mean)*($Old_size-$New_mean))" | bc -l`
Old_file_deviation_round=`echo "($Old_file_deviation+0.5)/1" | bc`
# Modifiled Thomson Tau test:
Tau=`echo "((1.95*$Deviation)+0.5)/1" | bc `
if [ $Tau -lt $Old_file_deviation_round ]; then
Old_sized_filtered_new=`echo $Old_sizes_filtered | sed "s/$Old_size//g"`
Old_sizes_filtered=$Old_sized_filtered_new
let Change=1
fi
done
- A hozzászóláshoz be kell jelentkezni
Két kérdés:
- van annak valami akadálya, hogy a statiszikát számító rutin kiegészüljön egy filterrel, amely fájlenevekkel vagy időszakokkal azonosított fájlokat dob ki az összesítésből? - ui. ez volna a leggyorsabb ír a sebre;
- van annak oka, hogy az awk meghívása után visszatérsz shellbe, amelyből processzek rengetegét hívod meg olyan feladatok elvégzésére, amilyenre az awk nem csak hogy képes, de sokkal áttekinthetőbb kóddal képes, mint a shell? - ez ui. a sebességen változtatna drasztikusan.
- A hozzászóláshoz be kell jelentkezni
1- A script egy masik reszen elvegezzuk a megfelelo fajlnevek szureset, szoval itt csak a relevans fajlokrol van szo
- A hozzászóláshoz be kell jelentkezni
2- Ehez szerenek okleteket kapni. De hirtelelnjeben nem lattom mit lehet meg awk-ban elvegezni. Lenyegeben minden egyes fajlmeretet egyesevel vizsgalunk, hogy kiugro ertek-e, ha igen akkor ujra kell szamolni az atlagot es a szorast.
Amugy koszonom, most mar sokkal gyorsabb: a megjegyzesed vilagitott ra, hogy nem kell az atlagot es a szorast mindig ujraszamolni, csak, ha kidobunk egy kiugo erteket.
- A hozzászóláshoz be kell jelentkezni