Portál AbcLinuxu, 9. května 2025 21:28

Dotaz: optimalizace cteni ze souboru v BASHi

14.10.2010 10:36 ext3fs
optimalizace cteni ze souboru v BASHi
Přečteno: 520×
Odpovědět | Admin
ahoj,

resim jak zrychlit v BASHi prochazeni log souboru. V cyklu potrebuji nacitat po radcich coz resim pomoci:
while read STR;
do
   :
done < file
Pokud spustim takovy testovaci skrypt na soubor o cca 15 MB textu, tak jsou hodnoty nasledujici
real    0m3.328s
user    0m2.948s
sys     0m0.380s
ale cteni:
cat file > /dev/null

real    0m0.016s
user    0m0.000s
sys     0m0.016s

- s pouzitim vystupu jde cas rapidne nahoru
while read STR;
do
   echo $STR > /dev/null
done < file

real    0m15.435s
user    0m14.281s
sys     0m1.060s
Pridam-li do takoveho skryptu par grepu na filtrovani tak je prace s takovym souborem na nekolik minut. Je nejaka moznost urychleni?

Diky.

Řešení dotazu:


Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

14.10.2010 11:18 Semo | skóre: 45 | blog: Semo
Rozbalit Rozbalit vše Re: optimalizace cteni ze souboru v BASHi
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pridat par grepov znamena sputat desattisice procesov. Spustenie externeho procesu je jedna z najdrahsich veci, ktora sa da v bashi spravit. Vzdy je lepsie pustit jeden grep na 1000 riadkov ako 1000 grepov na riadok.

Takze bud sa lepsie naucis grep, aby si to s nim zvladol bez cyklu, alebo pouzijes sed (prip. awk) rovno na ten logfile. Alebo si pozries manual ku bashu a zistis, ze matchovanie podla regexpov sa da spravit aj v bashi cez [[ =~ ]] a pole bash_REMATCH, cim usetris spustanie externych procesov.
If you hold a Unix shell up to your ear, you can you hear the C.
14.10.2010 19:27 ext3fs
Rozbalit Rozbalit vše Re: optimalizace cteni ze souboru v BASHi
Pouziti regexu primu v bashi a omezeni spousteni grepu je opradu vyraznym zrychlenim. Diky za radu.
15.10.2010 05:56 Ash | skóre: 53
Rozbalit Rozbalit vše Re: optimalizace cteni ze souboru v BASHi
Další možností je, pokud nepracujete s nabodeníčky (utf8), používat pro nástroje typu grep, sed LANG=C.

Např. soubor 500000 řádků kladných a záporných čísel:
bash$ time grep "^-" soubor > soubor2

real    0m13.343s
user    0m13.322s
sys     0m0.013s

bash$ time LANG=C grep "^-" soubor > soubor2

real    0m0.024s
user    0m0.007s
sys     0m0.010s
Pro přístup k utf8 znakům (ke každému jednomu) se používá jiná rutina (mohou mít různou délku), takže to dost zpomaluje. Je to v zásadě chyba, možná to je už někde vyřešené/optimalizované, nevím.
15.10.2010 06:01 Ash | skóre: 53
Rozbalit Rozbalit vše Re: optimalizace cteni ze souboru v BASHi
Nebo samozřejmě i pro Bash jako ve vašem příkladě. Pro všechno co čte znaky:
bash$ time bash -c "while read STR; do :; done < soubor"

real    0m6.095s
user    0m5.660s
sys     0m0.430s

bash$ time LANG=C bash -c "while read STR; do :; done < soubor"

real    0m3.180s
user    0m2.723s
sys     0m0.447s
14.10.2010 11:33 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: optimalizace cteni ze souboru v BASHi
Odpovědět | | Sbalit | Link | Blokovat | Admin
A napadlo Vás, že toto „- s použitim vystupu jde cas rapidne nahoru“ není problém čtení? :)
A opravdu to potřebujete procházet po řádku rúčo?
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
14.10.2010 11:49 Vojtěch Horký | skóre: 39 | blog: Vojtův zápisník | Praha
Rozbalit Rozbalit vše Re: optimalizace cteni ze souboru v BASHi
Odpovědět | | Sbalit | Link | Blokovat | Admin
Je nejaka moznost urychleni?
Jediný způsob, jak zrychlit shellovský skript je použít jiný programovací jazyk ;-).

Ale vážně - pokud jde o nějaké složité manipulace s textem, zkuste PERL (pokud ho neumíte, tak základy, abyste zbastlil náhradu grepu v cyklu přes řádky, se naučíte za pár minut). Těch 15MB pro něj nebude příliš velký problém...

Shellovské skripty se obvykle používají, pokud Vám jde o přenositelnost (mezi různými Unixovými systémy, kde jsou k dispozici pouze základní nástroje typu grep, sed, cut ...) a nepotřebujete výkon. Nebo pokud si potřebujete zautomatizovat spuštění několika programů po sobě (a tam zpoždění pár vteřin nevadí, protože to jde určitě rychleji, než kdybyste to pouštěl ručně).
I am always ready to learn although I do not always like to be taught. (W. Churchill)
14.10.2010 12:33 Semo | skóre: 45 | blog: Semo
Rozbalit Rozbalit vše Re: optimalizace cteni ze souboru v BASHi
Kecy. Aj v bashi sa da programovat efektivne a da sa aj prasacky. Kubicko-zlozity algoritmus v C-kcu bude na netrivialnych vstupoch dalkeo pomalsi nez linearny v bashi. Navyse nastroje, ktore typicky robia namahavu pracu su pisane v C-cku (grep, sed ai.), takze staci dodrzat par pravidiel pri ich spustani (spustat malokrat na velke vstupy a nie velakrat na male vstupy) a nebude prakticky rozdiel pri pouzivani skriptov a kompilovaneho optimalizovaneho kodu.
If you hold a Unix shell up to your ear, you can you hear the C.

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.