Velmi pomalý grep

Velmi pomalý grep
« kdy: 30. 09. 2024, 12:44:03 »
Mám problém u 3MB vstupního textu, pouštím na něj grep a vypisuje to na terminálu asi 4-8 výskytů za sekundu -což je tragédie.  (armv7l Cortex A53 38 BogoMips) víc jak 30s. asi Jak to urychlit?  Vtipný je ,že když místo patternu  změním https: za http: tak je to do 5s hotové i když tam ponechám  výraz, které je pro https: pomalý[^/]+. , neboli  to není triviální https:..............

to nejduležitější: Přepínače jsou -o a -P.  Výraz je
:   "https://\\K[^/]+"
Zkoušel jsem to downgradovat postupně, až jsem došel na na  grep -o https:................................. Což je dostatečně rychlé. Stejně rychlé jako  -o -E https:.{60}... To by šlo použít (a následně použít pípu s druhým grepem, což bude mnohem rychlejší na menším množstvím textu), ale má to jednu nevýhodu, že to vyřadí některé výskyty, kde se vyskytuje nový řádek ,což tedy nechci. A znak CR+LF se javascriptu vyskytuje ,že

Varianty:
odmazat \K
nahradit [^/]+ za .+?/ (funguje jeno s grep -P , zatímcto s grep -E to tiše funguje chybně)
nahradit za ....

Kód: [Vybrat]
curl "https://www.nytimes.com/fides/api/v1/privacy-experience?show_disabled=false&region=eea&component=overlay&has_notices=true&has_config=true&systems_applicable=true&include_gvl=true&include_meta=true" |grep -Eo ":\"https://.{45}" | grep
# je rychlé ale vyřadí to záznamy kde se vyskytuje newline po 45 znacích

Za další , zkusil jsem magický přepínač grep -z. ale s přepínačem -P je pomalý, -s E rychlý. proč?


https://www.nytimes.com/fides/api/v1/privacy-experience?show_disabled=false&region=eea&component=overlay&has_notices=true&has_config=true&systems_applicable=true&include_gvl=true&include_meta=true


Mimochodem doporučuji to  sosnout ,wgetnout  grepnout ,sortnout a uniqnout a uvidíte věci . (Je tam pár false positives)


Perl regex (-P) a extended regex (-E) jsou dvě různé implementace, rychlost je může dost lišit. A mají trochu jinou syntax. Mimochodem, -P -z je experimentální kombinace.

Co má být ".+?"? Nemá to být ".*"? (Z hlavy nevím priority.)

Bez -K se lze obejít použitím nástroje sed. Buď následně odstranit všechna http:// ze začátku řádku, případně se na greo vykašlat úplně a řešit to jen sedem.

Re:Velmi pomalý grep -P oproti grep -E
« Odpověď #2 kdy: 30. 09. 2024, 16:21:11 »
Problém se mi zredukoval na to, že -P je pomalejší než -E... Nakonec jsem přišel i na jednogrepovou pipeline |grep -Ezo ":\"https://.[^/]+" .  Doba trvání je 2s cpu času mínus 1.6 na download ,což už jde (bohužel time měří i download a nechce se mi to ukládat, zatímco v bashi 5.1 jde příkaz time za pípu tak v 5.0 to nejde a curl zahlásí failed to) ...

Ale zarazilo mě, že to -P je šíleně pomalé.



Jo, \K je syntaktický sugar, navíc v -E nefunguje.
pps://.+?/ je  "aspoň 1 znak, požrat minimum, co je možné" narozdíl od varianty bez "?",  to je greddy/ungreedy operátor(modifikátor?), tím pádem by tam šlo i použít ttps://.*?/,  protože doména má minimálně 7 znaků (snad to není Jirsák trigger)

Ale důležité je to lomítko za ,aby to kde to má skončit.  takže ps://.*?/ je stejné jako ps://[^/]+/

Ink

  • *****
  • 670
    • Zobrazit profil
    • E-mail
Re:Velmi pomalý grep
« Odpověď #3 kdy: 01. 10. 2024, 09:13:45 »
Chápu, že jde o nevyžádanou radu a nevím, nakolik to na Tvé platformě je možné, ale zkusil jsi nepoužít grep a nahradit ho něčím jiným? Kupř. ripgrep (musí mít --features 'pcre2') to na mém laptopu chroupe 22 ms a grep 7,6 s. To je dost zásadní rozdíl a důvod grep nepoužívat, pokud to je možné.

aaa158

  • ***
  • 248
    • Zobrazit profil
    • E-mail
Re:Velmi pomalý grep
« Odpověď #4 kdy: 01. 10. 2024, 10:37:45 »
+1 za ripgrep  :) odkedy som nan presiel prakticky grep nepouzivam okrem trivialit.