Portál AbcLinuxu, 4. listopadu 2025 00:54
while read STR; do : done < filePokud spustim takovy testovaci skrypt na soubor o cca 15 MB textu, tak jsou hodnoty nasledujici
real 0m3.328s user 0m2.948s sys 0m0.380sale 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.060sPridam-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:
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.010sPro 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.
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
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ě).
            
        Tiskni
            
                Sdílej:
                
                
                
                
                
                
            
    
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.