Portál AbcLinuxu, 10. května 2024 20:05


Dotaz: shell, skript, rychlost.

10.12.2004 08:32 JaSel | skóre: 17 | blog: kseles
shell, skript, rychlost.
Přečteno: 453×
Odpovědět | Admin
Zdravim, resim nasledujici problem. Jako vystup z mericiho pristroje (DMA) mam textovy soubor visco.dat, ktery v podstate obsahuje tri sloupce ciselnych dat. Je v nem zapsano celkem 285 skenu po 2048 radcich, oddelenych vzdycky 5 radky balastu. Velikost souboru je asi 20MiB.
bash-2.05b$ wc visco.dat
585105 1754175 19876543 visco.dat
Potreboval bych jako vystup soubor visco.txt, zbaveny toho balastu, aby v nem zbyly jenom ty cisla. Zaroven (pro jistotu, kdyby ten vysledek byl tak velky, ze by ho nasledne Octave neschroupla -- neznam limity Octave, takze jistota je jistota), bych chtel jako vystup rozdeleny do 285 souboru podle tech skenu. Napsal jsem si na to nasledujici skript: #!/bin/bash

# Sortovani viskozitnich dat z DMA
# vzdycky 5 radku srotu a 2048 radku dat;
# v souboru visco.dat, celkem 285x
rm c
declare -i a b c;
a=0;
until [ $a = 285 ]; do
echo $a
b=0;
until [ $b = 2048 ]; do
c=2053*a+b+6;
sed -ne "$c p" visco.dat >> visco.$a;
sed -ne "$c p" visco.dat >> visco.txt;
b=b+1;
done
a=a+1;
done
Skript jsem spustil vcera odpoledne a dneska rano jsem ocekaval vysledek. Prave ted je to nekde u 55. skenu, takze je hotova asi jedna petina. To se mi zda pomerne pomale (Athlon 750MHz, 320MiB RAM, Slackware 9.1, kernel 2.6.9, reiserfs). Podel top basti skript okolo 0.3 % CPU i RAM, sed mezi 2-20 % CPU a cca 5 % RAM. Predpokladam, ze podobnou ulohu budu resit casteji, tak bych se chtel zeptat, jestli nekoho nenapada, jak to trochu urychlit. DMA masina vychrli tenhle soubor dat asi po hodine mereni a to je jeden vzorek. Mozna by to chtelo postavit se k tomu problemu uplne jinak, ja jsem vychazel z toho, co uz znam (a toho neni v oblasti programovani a psani skriptu mnoho). Dik za rady, JS
Nástroje: Začni sledovat (2) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

10.12.2004 09:56 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: shell, skript, rychlost.
Odpovědět | | Sbalit | Link | Blokovat | Admin
To je fakt drsné řešení ;-) Navíc se děsím, co udělá řádek c=2053*a+b+6; (hint: shell nevyhodnocuje aritmetické výrazy ,jen tak`)

Jde to řešit různě, řešení asi ideově nejpodobnější tvému vypadá (nazvěme to v.sed):
#!/bin/sed -nf
1,2048 wvisco.1
2049,2052 wvisco.txt
2053,4100 wvisco.2
4101,4105 wvisco.txt
...
které použiješ
./v.sed <visco.dat
Samozřejmě, že v.sed je sám také generovatelný, což uděláš jednou nebo když se změní počty.
10.12.2004 10:24 unchallenger | skóre: 69 | blog: unchallenger
Rozbalit Rozbalit vše Re: shell, skript, rychlost.
Špatně jsem si přečetl zadání. No stejně to bylo kvadratické.
#!/usr/bin/python
import sys
                                      # Zdravím Leoše a děkuji mu za P tagy
base = 'visco'
nd = 2048
nt = 5
                                      # Zdravím Leoše a děkuji mu za P tagy
i = 0
for line sys.stdin:
    if i % (nd + nt) == 0:
        fi = file(base + ('.%03d' % (i/(nd + nt) + 1)), 'w')
    if i % (nd + nt) < nd:
        fi.write(line)
    i += 1
Spojit výsledky catem snad zvládneš.
10.12.2004 10:13 MOJE
Rozbalit Rozbalit vše Re: shell, skript, rychlost.
Odpovědět | | Sbalit | Link | Blokovat | Admin
smarja pano :-)
to bude mockrat projity soubor. Co zkusit misto sedu pouzit proste read a ten soubor tomu skriptu nacpat na standardni vstup. pak ten algoritmus bude vypadat priblizne takhle:
for((i=0;i<285;i++)); do
#nejdriv prectu balast
  for((j=0;j<5;j++)); do
     read radek;
  done 
#pak uzitecne radky
  for((j=0;j<2048;j++)); do
     read radek;
     echo $radek >>visco.$i
     echo $radek >>visco.txt
  done
done
Rekl bych, ze tohle to opravdu dokaze "trochu" urychlit
10.12.2004 10:23 MOJE
Rozbalit Rozbalit vše Re: shell, skript, rychlost.
Jo a jen tak na otestovani na Athlon64 2800 to trvalo necele 2 minuty. Napsane v C by to bylo samozrejme daleko rychlejsi, ale to ma asi cenu tak od 10000 radku na mereni.
10.12.2004 12:00 JaSel | skóre: 17 | blog: kseles
Rozbalit Rozbalit vše Re: shell, skript, rychlost.
Odpovědět | | Sbalit | Link | Blokovat | Admin
Diky za napady.

Vezmu to poporade. Radek c=2053*a+b+6; jsem odzkousel, pocita mi cisla radku, ktere me zajimaji. Python vubec neznam (resp. vim, ze existuje), takze me to nenapadlo. Nejvice se mi libi to posledni reseni -- jeste jednou diky, vyzkousim.

JS
29.12.2004 04:56 Honza_S
Rozbalit Rozbalit vše Re: shell, skript, rychlost.
Kdysi jsem provadel filtrovani textu o velikosti cca 10-50MB textu. Vysledek na P3/950Mhz a 128MB RAM byl kolem 20-50 sekund v jazyce C. Pricemz jsem si vsimnul zajimave veci: texty jsem nechal default zkomprimovat pomoci gzipu - velikost pak byla 3x - 4x mensi, cas zpracovani se zmensil na cca 7-10 sekund (pochopitelne bez casu nutneho ke komprimaci) u puvodniho text. souboru o velikosti 30MB.

Z jineho soudku: na svem serveru mam v provozu php stranku, kde je moznost zobrazeni datoveho provozu za posledni 3 dny (Asi 1000 poslednich radku textoveho logu). Doba zpracovani v bash-i trva asi 7 sekund (generovani grafu), pro prepsani do C tato operace je temer okamzite <0.1s.

Doporucuji u takovychto "silovych" operaci jazyk C, pripadne pouziti zlib, pokud je nutnost opakovaho filtrovani - i pro usporu mista.

Honza

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.