ugrás a tartalomhoz

Archívum - Jún 27, 2020

Csal a linuxos grep?

mind1 valami név · 2020. Jún. 27. (Szo), 20.01
Regex alapú kereséssel küzdöttem, mert amit Pythonban megírtam, nagyon lassúnak tűnt nagy tömegű adatnál.
Gyakorlatilag a "grep -va -f pattern.txt source.txt" parancsot írtam át python 3-ra.
Az időmérést úgy próbáltam kivitelezni, hogy a kimenetet átküldtem a /dev/null-ba.

time ./script.sh >/dev/null
time ./script.py >/dev/null
A .sh végű, ami a grep-t tartalmazta, úgy .2sec alatt futott le. A python 7sec (35x eltérés)
Mivel túl sok volt a kimenet, első körben meg akartam nézni, hogy a két szkript azonos számú sort produkál-e:

time ./script.sh | wc -l >/dev/null
time ./script.py | wc -l >/dev/null
És itt koppantam egy nagyot: a grep-es verzió pár másodperccel hosszabb ideig futott.
Próbáltam megnézni strace segítségével, hogy mit művel ha közvetlenül a /dev/null-ba van irányítva a stdout, de csak annyit láttam, hogy egy nagyságrenddel kevesebb rendszerhívást végez olyankor.
Mintha nem is olvasná végig az inputot...
Ez lehetséges?
Tényleg az első olyan sornál ...
(ufff, na mindegy, már itt hagyom, okulásképp az utókornak :) )

... szóval ahogy ezt írtam, akkor esett le: a grep, ha nem kell semmit kiküldenie a stdout-ra, akkor az exit code-ban ($?) adja vissza, hogy sikeres volt-e a keresés vagy sem. Ehhez viszont nem kell végigmennie a teljes inputon, elég ha az első olyan sorig megy, ami miatt 0-val térhet vissza. Ergo a -v miatt az első olyan sorig megy, ami nem illeszkedik egyik megadott mintára sem, utána kilép. Az én programom meg mindenképp végigmegy, mivel szükségem van általában az outputra. :)

Úgyhogy sikerült gyorsabb grep-t írni pythonban, mint amilyen az eredeti C-ben. :)