GNU grep ti sembrava lento? Sappi che è così, ma è risolto

GNU logo
GNU logo

Chiunque si sia avvicinato al mondo Linux ha incontrato il comando grep (e se non sapete da dove viene il nome, cliccate qui), che è forse anche il più usato – ed abusato. Ma è indubbio che semplicità e velocità sono i suoi punti di forza. O almeno, lo erano…

Poco dopo il rilascio della scorsa versione, la 3.6, è stato inviato un report per un bug con specificato come in alcune situazioni particolari le prestazioni del comando sembrassero peggiorare. E non di poco: nel report si passava dall’eseguire il comando in pochi decimi di secondo a impiegarci una decina di secondi. Un aumento del… semplicemente troppo.

In pochi giorni si è identificato il problema, ed è stato risolto con due patch complementari, ma si è dovuto attendere il rilascio della nuova versione stabile, la 3.7, per poterne usfruire. Rilascio avvenuto il 14 agosto.

grep è usato per fare match di una stringa (il pattern) rispetto ad un testo. Tipicamente, il comando è dato per un singola stringa per un singolo file, ma è possibile fornire molti pattern, basta che siano a loro volta contenuti in un file. Ed è questa la condizione particolare che è stata risolta.
Al momento dell’esecuzione, infatti, i pattern sono tutti letti e indicizzati, in modo da poter fare i confronti velocemente. Ma questa indicizzazione porta via tempo, molto tempo se si è sfortunati. E a dirlo non siamo noi, ma proprio le note di rilascio:

Preprocessing N patterns would take at least O(N^2) time when too many patterns hashed to too few buckets. This now takes seconds, not days:
| grep -Ff <(seq 6400000 | tr 0-9 A-J)
[Bug#44754 introduced in grep 3.5]

Pre-processare N pattern avrebbe richiesto un tempo di almeno O(N^2) quando troppi pattern erano indicizzati in troppi pochi bucket. Questo ora richiede secondi, non giorni:
| grep -Ff <(seq 6400000 | tr 0-9 A-J)
[Bug#44754 introdotto con grep 3.5]

Se rientrate nel caso indicato, sarete sicuramente interessati all’aggiornamento. Che però – a seconda della distribuzione che usate – potrebbe arrivare fra qualche mese. Questo perché grep è un comando tanto centrale da richiedere parecchi test prima di essere rilasciato al pubblico, aggiornato.
Se proprio vi serve… non vi rimane che compilarlo!

Ho coltivato la mia passione per l'informatica fin da bambino, coi primi programmi BASIC. In età adulta mi sono avvicinato a Linux ed alla programmazione C, per poi interessarmi di reti. Infine, il mio hobby è diventato anche il mio lavoro.
Per me il modo migliore di imparare è fare, e per questo devo utilizzare le tecnologie che ritengo interessanti; a questo scopo, il mondo opensource offre gli strumenti perfetti.

Tags: , ,