abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
eParkomat, startup z ČR, postoupil mezi finalisty evropského akcelerátoru ChallengeUp!
Robot na pivo mu otevřel dveře k opravdovému byznysu
Internet věcí: Propojený svět? Už se to blíží...
včera 22:44 | Komunita

Joinup informuje, že Mnichov používá open source groupware Kolab. V srpnu byl dokončen dvouletý přechod na toto řešení. V provozu je asi 60 000 poštovních schránek. Nejenom Kolabu se věnoval Georg Greve ve své přednášce Open Source: the future for the European institutions (SlideShare) na konferenci DIGITEC 2016, jež proběhla v úterý 29. listopadu v Bruselu. Videozáznam přednášek z hlavního sálu je ke zhlédnutí na Livestreamu.

Ladislav Hagara | Komentářů: 1
včera 15:30 | Zajímavý projekt

Společnost Jolla oznámila v příspěvku Case study: Sailfish Watch na svém blogu, že naportovala Sailfish OS na chytré hodinky. Využila a inspirovala se otevřeným operačním systémem pro chytré hodinky AsteroidOS. Použita je knihovna libhybris. Ukázka ovládání hodinek na YouTube.

Ladislav Hagara | Komentářů: 5
včera 14:15 | Nová verze

Byla vydána verze 7.1.0 skriptovacího jazyka PHP používaného zejména k vývoji dynamických webových stránek. Jedná se o první stabilní verzi nejnovější větvě 7.1. Přehled novinek v dokumentaci. Podrobnosti v ChangeLogu. K dispozici je také příručka pro přechod z PHP 7.0.x na PHP 7.1.x.

Ladislav Hagara | Komentářů: 0
včera 12:55 | Nová verze

Google Chrome 55 byl prohlášen za stabilní. Nejnovější stabilní verze 55.0.2883.75 tohoto webového prohlížeče přináší řadu oprav a vylepšení (YouTube). Opraveno bylo také 36 bezpečnostních chyb. Mariusz Mlynski si například vydělal 22 500 dolarů za 3 nahlášené chyby (Universal XSS in Blink).

Ladislav Hagara | Komentářů: 4
včera 11:55 | Pozvánky

Máte rádi svobodný software a hardware nebo se o nich chcete něco dozvědět? Přijďte na 135. sraz spolku OpenAlt, který se bude konat ve čtvrtek 8. prosince od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Sraz bude tentokrát tématický. Bude retro! K vidění budou přístroje jako Psion 5mx nebo Palm Z22. Ze svobodného hardwaru pak Openmoko nebo čtečka WikiReader. Přijďte se i vy pochlubit svými legendami, nebo alespoň na pivo. Moderní hardware má vstup samozřejmě také povolen.

xkucf03 | Komentářů: 0
včera 00:10 | Nová verze

Byla vydána verze 3.2 svobodného systému pro detekci a prevenci průniků a monitorování bezpečnosti počítačových sítí Suricata. Z novinek lze zmínit například podporu protokolů DNP3 a CIP/ENIP, vylepšenou podporu TLS a samozřejmě také aktualizovanou dokumentaci.

Ladislav Hagara | Komentářů: 0
1.12. 21:00 | Nová verze

Byla vydána beta verze Linux Mintu 18.1 s kódovým jménem Serena. Na blogu Linux Mintu jsou hned dvě oznámení. První o vydání Linux Mintu s prostředím MATE a druhé o vydání Linux Mintu s prostředím Cinnamon. Stejným způsobem jsou rozděleny také poznámky k vydání (MATE, Cinnamon) a přehled novinek s náhledy (MATE, Cinnamon). Linux Mint 18.1 bude podporován až do roku 2021.

Ladislav Hagara | Komentářů: 0
1.12. 16:42 | Nová verze

Byl vydán Devuan Jessie 1.0 Beta 2. Jedná se o druhou beta verzi forku Debianu bez systemd představeného v listopadu 2014 (zprávička). První beta verze byla vydána v dubnu letošního roku (zprávička). Jedna z posledních přednášek věnovaných Devuanu proběhla v listopadu na konferenci FSCONS 2016 (YouTube, pdf).

Ladislav Hagara | Komentářů: 0
1.12. 15:16 | Komunita

Na GOG.com začal zimní výprodej. Řada zlevněných her běží oficiálně také na Linuxu. Hru Neverwinter Nights Diamond lze dva dny získat zdarma. Hra dle stránek GOG.com na Linuxu neběží. Pomocí návodu ji lze ale rozběhnout také na Linuxu [Gaming On Linux].

Ladislav Hagara | Komentářů: 1
1.12. 13:14 | Bezpečnostní upozornění

Byla vydána verze 2.7.1 živé linuxové distribuce Tails (The Amnesic Incognito Live System), jež klade důraz na ochranu soukromí uživatelů a anonymitu. Řešeno je několik bezpečnostních problémů. Aktualizován byl především Tor Browser na verzi 6.0.7. Tor Browser je postaven na Firefoxu ESR (Extended Support Release) a právě ve Firefoxu byla nalezena a opravena vážná bezpečnostní chyba MFSA 2016-92 (CVE-2016-9079, Firefox SVG Animation

… více »
Ladislav Hagara | Komentářů: 0
Kolik máte dat ve svém domovském adresáři na svém primárním osobním počítači?
 (32%)
 (24%)
 (29%)
 (7%)
 (5%)
 (3%)
Celkem 759 hlasů
 Komentářů: 50, poslední 29.11. 15:50
Rozcestník
Reklama

Dotaz: Optimalizace scriptu v bashi

23.3.2011 11:29 beginer666 | skóre: 9
Optimalizace scriptu v bashi
Přečteno: 439×
Zdravim, rád bych se s vámi poradil na optimalizace programu.

Mám program v bashi který načítá data z http. Ty data uložim(wget > soubor) a následně je čtu(cat soubor) a dál separuju - takže cat neco |sed | grep | gawk | gawk | a následně to uložim do db ( | mysql -u user -p -D db) .

První otázka:

Dá se nějak zjistit co z toho všeho je nejnáročnější?

- ještě jsem neuvedl různé smyčky ve smyčce atd. atd. ale to možná nebude zas tak náročné.

Druhá otázka:

Jaký způsobem ten script můžu optimalizovat?

- aby byl rychleji proveden

- podle mého měření trvá na serveru se 4xCPU 15 minut, na serveru se 2xCPU 30 minut a na serveru s 1xCPU 55 minut.

Předem děkuji za hodnotné příspěvky.

B666

Řešení dotazu:


Odpovědi

23.3.2011 13:58 Miklik | skóre: 27 | Krnov
Rozbalit Rozbalit vše Re: Optimalizace scriptu v bashi
Napsat ho v něčem jiném. Napsal jsem si skript v bash co mi zpracovával co csv data z iostat, cca 100MB dat. Po hodině to zpracovalo sotva 10% dat. Přepsal jsem to javy a projelo to celé za 30 minut.
Netvrdím to, ale možná je to pravda.
23.3.2011 14:24 Semo | skóre: 44 | blog: Semo
Rozbalit Rozbalit vše Re: Optimalizace scriptu v bashi
Netusim, co tam robis, ale ak hodinu nieco parsujes, tak tam musis mat spustanie ohromneho poctu procesov. Proti spusteniu procesu (pipa atd)je vsetko ostatne uzasne rychle. Takze optimalizovat vnutra cyklov, precitat si manual ku prikazom a nepustat cat neco |sed | grep | gawk | gawk ked sa to cele da spravit 1 sedom alebo 1 gawkom. Nepustat 1000 sedov na 1000 suborov, ale 1 sed na 1000 suborov a tak podobne.
If you hold a Unix shell up to your ear, you can you hear the C.
23.3.2011 15:01 beginer666 | skóre: 9
Rozbalit Rozbalit vše Re: Optimalizace scriptu v bashi
Něco na tom je, akorát ty data se moc jednim sedem nebo awk dostat nedaj.
23.3.2011 15:32 Semo | skóre: 44 | blog: Semo
Rozbalit Rozbalit vše Re: Optimalizace scriptu v bashi
Take zadania sice existuju, ale drviva vacsina praktickych pouziti vystaci s 1. 1 sed s ukrutnym prikazom v nom sa spusta daleko rychlejsie ako niekolko sedov s primitivnym. A az na vynimky je rychlost behu sedu len velmi malo zavisla na zlozitosti prikazu.
If you hold a Unix shell up to your ear, you can you hear the C.
23.3.2011 15:06 Messa | skóre: 39 | blog: Messa
Rozbalit Rozbalit vše Re: Optimalizace scriptu v bashi
Také hlasuji pro to napsat to v něčem jiném - "stačí" nějaký skriptovací jazyk, např. Python nebo Ruby. Odpadne několik problémů: nebudou se neustále spouštět nějaké procesy, nebu se neustále znovu připojovat do databáze (pokud jsi to MySQL měl třeba ve smyčce), navíc pochybuju o tom, že jsi těmi sedy a awky korektně escapoval hodnoty v SQL příkazech.

Pokud s jinými jazyky nez bashem nemáš zkušenosti, nápiš sem nějaké zadání, měla by to být rychlovka (pokud jsi to predtim totiž řešil v básni, určitě to není nic složitého :).
23.3.2011 15:09 Messa | skóre: 39 | blog: Messa
Rozbalit Rozbalit vše Re: Optimalizace scriptu v bashi
Sakra, na ty automatické opravy v iOS musím dávat pozor. Ale oprava bash - báseň je pěkná :)
23.3.2011 15:41 beginer666 | skóre: 9
Rozbalit Rozbalit vše Re: Optimalizace scriptu v bashi
Díky - je na tebe nějakej email nebo skype-nickname?
23.3.2011 15:50 Sten
Rozbalit Rozbalit vše Re: Optimalizace scriptu v bashi
Třeba ten, co má na profilu ;-)
23.3.2011 22:50 rajo | skóre: 4 | Bratislava
Rozbalit Rozbalit vše Re: Optimalizace scriptu v bashi
Ak by si to chcel prepisat do perlu, odporucam moduly:
WWW::Mechanize
HTML::TreeBuilder
Data::Dumper
LWP::UserAgent
Priklad:
#!/usr/bin/perl -w
use strict;

$| = 1;

use LWP::UserAgent;
use HTML::TreeBuilder;
use Time::HiRes qw(gettimeofday tv_interval usleep sleep);
use URI;
use File::Path;
use Data::Dumper;

my $start_url   = 'http://blog.hostname.sk';
my $regexp      = 'MySQL';
my $ua = LWP::UserAgent->new;

my $response = $ua->get($start_url);
unless ($response->is_success) {
    warn $response->status_line;
}

#warn Dumper($response);
my $tree        = HTML::TreeBuilder->new_from_content($response->content);

my $base        = [ map { $_->attr('href'); } $tree->look_down(
        '_tag', 'base',
        sub { $_[0]->attr('href') ne '' }
    ) ]->[0];
$base ||= $start_url;
my @raw_links   = $tree->look_down(
    '_tag', 'a',
    sub { my $href = $_[0]->attr('href'); (defined($href) && $href =~ m/$regexp/i); }
);

#print Dumper(\@raw_links);
my @links = map { URI->new_abs( $_->attr('href'), $base)->as_string(); } @raw_links;

$tree = $tree->delete();

print Dumper(\@links);
Skript uvedeny vyssie najde na mojom blogu vsetky linky v suvislosti s MySQL ($regexp). Mozno potrebujes nieco podobne.
24.3.2011 16:40 beginer666 | skóre: 9
Rozbalit Rozbalit vše Re: Optimalizace scriptu v bashi
Díky za příklad mrknu na to.
24.3.2011 08:19 Ash | skóre: 53
Rozbalit Rozbalit vše Re: Optimalizace scriptu v bashi
Z toho co tu ještě nepadlo:
  1. paralelizace (souběžně stahovat a parsovat, aby relativně rychlé parsování nečekalo než se s...t...áááá...hne nějaká problémová stránka. Celkové zrychlení samozřejmě nebude nijak závratné, pokud je dostupnost stránek dobrá. Podle měření je problém spíš v prasování :)
  2. stahovat wgetem inteligentně (nestahovat třeba stránky které se nezměnily, pokud k tomu není z vaší strany důvod)
  3. ověřit, že pokud máte utf-8 locales, tak že nemáte nástroje které mají problémy s utf-8 (např. grep<2.6), kde časté volání funkce mbrtowc parsování řádově (!) zpomaluje
    printf "1\n2\n3\n4\n5" | ltrace grep "1" 2>&1 | grep -c '^mbrtowc('
    by mělo hodit tak "2" (ujistěte se že máte ltrace), nebo jinak, zpracování delšího souboru by mělo trvat zhruba stejně dlouho s nastaveným LANG=C jako bez něj.
Samozřejmě největší problém bude používání tolika nástrojů na něco, na co stačí jeden, ale to už bylo řečeno. cat před sed je jistě nesmysl (sed umí číst ze souboru), grep za sedem je patrně také nesmysl (výstup sedu lze libovolně přizpůsobit)
24.3.2011 16:41 beginer666 | skóre: 9
Rozbalit Rozbalit vše Re: Optimalizace scriptu v bashi
Jinak to vypadá že nejdelší doba je zápis do mysql ): tak to už se asi urychlit nedá co?
24.3.2011 18:32 Ash | skóre: 53
Rozbalit Rozbalit vše Re: Optimalizace scriptu v bashi
Dá, můžete si postupně vyrábět jeden mega insert, který pak provedete a vložíte vše najednou. Je to takový ten formát který si můžete vytvořit třeba při dumpování z phpMyAdmina, zapomněl jsem jak se mu říká :)

Ale i kdybyste jen vytvořil sadu N insertů a ten poslal do databáze (man mysql) tak to bude rychlejší, než pouštět N x mysql.
24.3.2011 19:46 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: Optimalizace scriptu v bashi
To lze často urychlit nejsnáze :).
Zkuste, jestli můžete, připravit pro 500 záznamů:
INSERT INTO `table` (`x`,`y`) VALUES 
 ('x1','y1'),
 ('x2','y2'),
…
 ('xN','yN');
A odeslat do DB a třeba jako nový proces. PS: Nedělejte to pro všechno naráz, 500-1500 by mohlo vycházet nejlépe (záleží na tom jak je DB řádek velký).
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
Řešení 1× (beginer666 (tazatel))
24.3.2011 21:16 Kit
Rozbalit Rozbalit vše Re: Optimalizace scriptu v bashi
Mám program v bashi který načítá data z http. Ty data uložim(wget > soubor) a následně je čtu(cat soubor) a dál separuju - takže cat neco |sed | grep | gawk | gawk | a následně to uložim do db ( | mysql -u user -p -D db) .
Ukládání výsledku do souboru je zdržující. Je lepší ho rovnou nasměrovat rourou do filtrů. Je vcelku jedno, kolik jich je, hlavně je nutné se vyvarovat cyklů v bashi. Nejvíc zdržují smyčky ve smyčce, ty by se v bashi vůbec neměly vyskytovat. Je možné, že právě ty jsou největší brzdou.

Úloha se dá pohodlně paralelizovat přidáním znaku & za volání bashové funkce. Ovšem v tomto případě bych omezil počet paralelních volání na nějakou rozumnou hodnotu (desítky až tisíce).

Hodně zdržují inserty do MySQL po jednom záznamu. Jak už bylo zmíněno, je lepší ukládat např. 500 záznamů jako jednu transakci.

Také bych možná zkusil jinou databázi, v tomto případě bych asi vybral Redis (pokud je to možné) a klidně ukládal po jednom záznamu. Je to velmi rychlé. Další proces může eventuálně (pokud to bude nutné) asynchronně záznamy vybírat a po skupinách sázet do MySQL.
24.3.2011 21:40 tomasgn | skóre: 23 | JN89GE
Rozbalit Rozbalit vše Re: Optimalizace scriptu v bashi
konstrukce "cat neco | sed | grep | gawk | gawk" by melo jit zvladnout cele pomoci awk. s rychlosti to nemusi byt az tak hrozne. co posloupnost prikazu jako sed a grep resi minuty, jedno awk vyplivne za vterinu.
25.3.2011 00:38 beginer666 | skóre: 9
Rozbalit Rozbalit vše Re: Optimalizace scriptu v bashi
Tak jsem to optimalizoval na wget| grep | sed | sed | awk | mysql ale nepřijde mi že je to rychlejší.

Rozdělim jsem těch 3600 stránek co musim načíst na 10x360 a pouštim je najednou na pozadí.

Když si dám ps aux tak vidim:
root     11217  0.0  0.8   7544   840 pts/2    S    00:31   0:00 grep 
root     11218  0.0  0.8   9688   836 pts/2    S    00:31   0:00 sed 
root     11219  0.0  0.8   9688   864 pts/2    S    00:31   0:00 sed 
root     11220  0.0  0.9  10368   980 pts/2    S    00:31   0:00 gawk 
root     11221  0.0  2.5  33644  2524 pts/2    S    00:31   0:00 mysql 
root     11226  0.0  2.0  26644  2048 pts/2    S    00:31   0:00 wget
root     11227  0.0  0.8   7544   840 pts/2    S    00:31   0:00 grep 
root     11228  0.0  0.8   9688   832 pts/2    S    00:31   0:00 sed 
root     11229  0.0  0.8   9688   860 pts/2    S    00:31   0:00 sed 
root     11230  0.0  0.9  10368   984 pts/2    S    00:31   0:00 gawk 
root     11231  0.0  2.5  33644  2520 pts/2    S    00:31   0:00 mysql
root     11234  0.0  0.8   9688   836 pts/2    S    00:31   0:00 sed 
root     11235  0.0  0.8   9688   860 pts/2    S    00:31   0:00 sed 
root     11236  0.0  0.9  10368   980 pts/2    S    00:31   0:00 gawk  
root     11237  0.0  2.5  33644  2528 pts/2    S    00:31   0:00 mysql 
root     11238  0.0  2.0  26644  2048 pts/2    S    00:31   0:00 wget
root     11239  0.0  0.8   7544   844 pts/2    S    00:31   0:00 grep 
root     11240  0.0  0.8   9688   832 pts/2    S    00:31   0:00 sed 
root     11241  0.0  0.8   9688   864 pts/2    S    00:31   0:00 sed 
root     11242  0.0  0.9  10368   984 pts/2    S    00:31   0:00 gawk 
root     11243  0.0  2.5  33644  2524 pts/2    S    00:31   0:00 mysql 
root     11244  0.0  2.0  26644  2044 pts/2    S    00:31   0:00 wget 
root     11245  0.0  0.8   7544   840 pts/2    S    00:31   0:00 grep 
root     11246  0.0  0.8   9688   832 pts/2    S    00:31   0:00 sed
root     11247  0.0  0.8   9688   860 pts/2    S    00:31   0:00 sed 
root     11248  0.0  0.9  10368   980 pts/2    S    00:31   0:00 gawk 
root     11249  0.0  2.5  33644  2528 pts/2    S    00:31   0:00 mysql 
root     11250  0.0  2.0  26644  2044 pts/2    S    00:31   0:00 wget 
root     11251  0.0  0.8   7544   840 pts/2    S    00:31   0:00 grep 
root     11252  0.0  0.8   9688   832 pts/2    S    00:31   0:00 sed 
root     11253  0.0  0.8   9688   864 pts/2    S    00:31   0:00 sed 
root     11254  0.0  0.9  10368   980 pts/2    S    00:31   0:00 gawk 
root     11255  0.0  2.5  33644  2528 pts/2    S    00:31   0:00 mysql
root     11257  0.0  2.0  26644  2044 pts/2    S    00:32   0:00 wget 
root     11258  0.0  0.8   7544   840 pts/2    S    00:32   0:00 grep 
root     11259  0.0  0.8   9688   832 pts/2    S    00:32   0:00 sed 
root     11260  0.0  0.8   9688   864 pts/2    S    00:32   0:00 sed 
root     11261  0.0  0.9  10368   980 pts/2    S    00:32   0:00 gawk 
root     11262  0.0  2.5  33644  2524 pts/2    S    00:32   0:00 mysql 
root     11264  0.0  2.0  26644  2044 pts/2    S    00:32   0:00 wget 
root     11265  0.0  0.8   7544   840 pts/2    S    00:32   0:00 grep 
root     11266  0.0  0.8   9688   832 pts/2    S    00:32   0:00 sed 
root     11267  0.0  0.8   9688   860 pts/2    S    00:32   0:00 sed
root     11268  0.0  0.9  10368   984 pts/2    S    00:32   0:00 gawk
root     11269  0.0  2.5  33644  2528 pts/2    S    00:32   0:00 mysql 
root     11271  0.0  2.0  26644  2044 pts/2    S    00:32   0:00 wget 
root     11272  0.0  0.8   7544   844 pts/2    S    00:32   0:00 grep 
root     11273  0.0  0.8   9688   836 pts/2    S    00:32   0:00 sed 
root     11274  0.0  0.8   9688   860 pts/2    S    00:32   0:00 sed 
root     11275  0.0  0.9  10368   984 pts/2    S    00:32   0:00 gawk  
root     11276  0.0  2.5  33644  2524 pts/2    S    00:32   0:00 mysql 
root     11278  0.0  2.0  26644  2048 pts/2    S    00:32   0:00 wget 
root     11279  0.0  0.8   7544   844 pts/2    S    00:32   0:00 grep 
root     11280  0.0  0.8   9688   832 pts/2    S    00:32   0:00 sed 
root     11281  0.0  0.8   9688   864 pts/2    S    00:32   0:00 sed 
root     11282  0.0  0.9  10368   984 pts/2    S    00:32   0:00 gawk  
root     11283  0.0  2.5  33644  2528 pts/2    S    00:32   0:00 mysql 
root     11284  0.0  1.1  16332  1160 pts/0    R+   00:32   0:00 ps aux
root     19216  0.0  3.3  70456  3336 ?        Ss   Mar24   0:00 sshd: root@pts/2
root     19548  0.0  2.0  19260  2056 pts/2    Ss+  Mar24   0:00 -bash
root     26928  0.0  0.9  10632   920 pts/2    S    Mar24   0:00 /bin/bash ./prog2
root     26929  0.0  0.9  10632   920 pts/2    S    Mar24   0:00 /bin/bash ./prog2
root     26930  0.0  0.9  10632   920 pts/2    S    Mar24   0:00 /bin/bash ./prog2
root     26931  0.0  0.9  10632   920 pts/2    S    Mar24   0:00 /bin/bash ./prog2
root     26932  0.0  0.9  10632   920 pts/2    S    Mar24   0:00 /bin/bash ./prog2
root     26933  0.0  0.9  10632   920 pts/2    S    Mar24   0:00 /bin/bash ./prog2
root     26934  0.0  0.9  10632   920 pts/2    S    Mar24   0:00 /bin/bash ./prog2
root     26935  0.0  0.9  10632   920 pts/2    S    Mar24   0:00 /bin/bash ./prog2
root     26936  0.0  0.9  10632   920 pts/2    S    Mar24   0:00 /bin/bash ./prog2
root     26937  0.0  0.9  10632   920 pts/2    S    Mar24   0:00 /bin/bash ./prog2

Přijde mi jako že se to docela fláká, vytížení cpu na 00 nic.

Zkusim to ještě nenačítat rovnou do mysql a uvidim. Jinak fakt nevim.
Řešení 1× (beginer666 (tazatel))
25.3.2011 06:34 Ash | skóre: 53
Rozbalit Rozbalit vše Re: Optimalizace scriptu v bashi
Jsem si jist že spustit mysql 10x bude rychlejší, než ji spustit 3600x :) Jen tak dál. A grep | sed je do očí bijící, sed umí grepovat, zjednodušeně sed -e "/grep-like-regexp/ s/foo/bar/"
25.3.2011 08:33 beginer666 | skóre: 9
Rozbalit Rozbalit vše Re: Optimalizace scriptu v bashi
Díky za tip - nejsem žádný profi programátor (;
25.3.2011 08:50 beginer666 | skóre: 9
Rozbalit Rozbalit vše Re: Optimalizace scriptu v bashi
tak bohužel

nefunguje: sed -e "/hledaneslovo/ s/foo/bar/g"
funguje:  grep hledaneslovo | sed s/foo/bar/g

25.3.2011 10:32 Kit
Rozbalit Rozbalit vše Re: Optimalizace scriptu v bashi
sed -ne "/hledaneslovo/ s/foo/bar/gp"
25.3.2011 10:59 Ash | skóre: 53
Rozbalit Rozbalit vše Re: Optimalizace scriptu v bashi
To vynechá řádky kde sice je hledaneslovo, ale není foo. Řešení stejné jako to s grep viz níže.
25.3.2011 10:56 Ash | skóre: 53
Rozbalit Rozbalit vše Re: Optimalizace scriptu v bashi
ok, příliš zjednodušeno.

sed implicitně vypisuje vše, co dostane, jen zde mění foo na bar.

grep naopak vypisuje jen řádky s hledaneslovo

grep lze simulovat sedem (-n jako nevypisuj, p jako vypiš):
$ sed -n -e "/hledaneslovo/p"
Vaše (jen odhaduji) varianta vám vypíše řádky s hledaneslovo a foo tam změní na bar, if any.
$ printf "foo\nhledaneslovo foo\nhledaneslovo\n" | grep hledaneslovo | sed -e "s/foo/bar/"
hledaneslovo bar
hledaneslovo
Často je poptřeba jen vypsat podmíněně řádky, kde (resp. pokud) byla udělána substituce.
$ printf "foo\nhledaneslovo foo\nhledaneslovo\n" | sed -n -e "/hledaneslovo/ s/foo/bar/p"
hledaneslovo bar
ale pokud chcete i řádky, kde není foo, tak na řádcích s hledaneslovo uděláte nejdřív substituci, a pak co máte dalším příkazem (tedy nepodmíněně vždy) vypíšete. Příkazy se oddělují středníkem, sdružují se závorkami.
$ printf "foo\nhledaneslovo foo\nhledaneslovo\n" | sed -n -e "/hledaneslovo/ {s/foo/bar/;p}"
hledaneslovo bar
hledaneslovo
25.3.2011 17:20 beginer666 | skóre: 9
Rozbalit Rozbalit vše Re: Optimalizace scriptu v bashi
Konečně pořádně optimalizováno. Největší brzda byl zápis do MYSQL.

Teď už to krásně běží a ani to moc nežere paměti.

Řešim ovšem jiný problém - nejspíš si toho mého masivního surfování někdo všimnul protože se nemůžu dostast ze serveru na jejich stránky. Z ostatních serverů to jde. ((((((((:
25.3.2011 18:01 Ash | skóre: 53
Rozbalit Rozbalit vše Re: Optimalizace scriptu v bashi
Takže za každým wget přidat sleep 10 ... :D
Řešení 1× (beginer666 (tazatel))
25.3.2011 18:52 beginer666 | skóre: 9
Rozbalit Rozbalit vše Re: Optimalizace scriptu v bashi
To myslim že je uplně jedno - jelikož každá dávka prohledá 3600 + 1700 + 1600 = 6900 stránek jednou za hodinu tak to ze tam dám pauzu nijak nezmění množství dotazů (;
25.3.2011 19:12 Ash | skóre: 53
Rozbalit Rozbalit vše Re: Optimalizace scriptu v bashi
Nešlo mi o to změnit počet dotazů, ale snížit průběžné zatěžování serveru. Některé servery mohou mít z masivních stahovačů kopřivku, slušným stahovačům bránit nemusí, protože když budou tito chtít, tak si to veřejný obsah stejně nějak distribuovaně stahnou, takže primárně nejde o ochranu obsahu, ale o ochranu dobré odezvy serveru pro všechny návštěvníky.
25.3.2011 21:01 beginer666 | skóre: 9
Rozbalit Rozbalit vše Re: Optimalizace scriptu v bashi
zatížení se pohybuje od 500 do 1200 kbit za sekundu což mi nepřijde jako kritická zátěž
25.3.2011 21:40 Ash | skóre: 53
Rozbalit Rozbalit vše Re: Optimalizace scriptu v bashi
Stahováním webových stránek které ještě parsujete moc velký traffic neuděláte, šlo mi o počet dotazů za sekundu, nevím jak už to mám lépe a jasněji vyjádřit :)
pepe_ avatar 26.3.2011 15:33 pepe_ | skóre: 46
Rozbalit Rozbalit vše Re: Optimalizace scriptu v bashi

wget --wait=3 --limit-rate=3K -r -p http://www.abclinuxu.cz/poradna/programovani/show/331044

 

Pockat 3 vteriny a stahovar rychlosti  3K/s

 

a nezahnapne to net.

25.3.2011 06:31 Ash | skóre: 53
Rozbalit Rozbalit vše Re: Optimalizace scriptu v bashi
co posloupnost prikazu jako sed a grep resi minuty, jedno awk vyplivne za vterinu.

No to minuty vs vteřiny není pravda, ale je fakt, že spouštět několik procesů za sebou je vždy horší, než spustit jeden, ať už je to sed nebo awk. Pokud se to spouští 3600x, tak se pak ty vteřinky sčítají a je to o to rychlejší.
25.3.2011 08:40 tomasgn | skóre: 23 | JN89GE
Rozbalit Rozbalit vše Re: Optimalizace scriptu v bashi
co posloupnost prikazu jako sed a grep resi minuty, jedno awk vyplivne za vterinu.

No to minuty vs vteřiny není pravda
uz jsem skutecne videl skript, kde se kombinaci sed a grep a nevim co jeste podarilo nahradit jednim awk a skutecne to vedlo az k takovemu zrychleni. ale je fakt, ze uloha tam puvodne byla celkove spatne resena ;-)

Založit nové vláknoNahoru

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

ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.