Pagina 1 di 1

performance grep -f

Inviato: lun giu 29, 2015 16:41
da ZeroUno
faccio
grep -f filtro filedagreppare

solo che il filtro è grande oltre 1000 righe e filedagreppare oltre 4000

capite che le performance non sono il massimo (siamo nell'ordine di 3 minuti)


Esiste un modo più performante di eseguire la stessa ricerca (magari con awk o perl, ma che non sia troppo complesso)?

Capisco che è una ricerca di complessità computazionale quadratica, ma forse si può ottimizzare considerando che la struttura del file sorgente e quello destinazione sono conosciuti:

sorgente:
1000 righe simini a

Codice: Seleziona tutto

 aaa_base [^ ]\+ [^ ]\+ [0-9]\+
 xorg-server-xephyr [^ ]\+ [^ ]\+ [0-9]\+_slack14.1

(spazi iniziali e finali inclusi); vi ricorda qualcosa? ;)
mentre il file da greppare è /var/lib/slackpkg/pkglist, quindi

Codice: Seleziona tutto

...
patches xorg-server-xephyr 1.14.3 i486 3_slack14.1 xorg-server-xephyr-1.14.3-i486-3_slack14.1 ./patches/packages txz
slackware aaa_base 14.1 i486 1 aaa_base-14.1-i486-1 ./slackware/a txz
...


l'output deve essere nello stesso ordine in cui è pkglist e quindi non in ordine alfabetico per pacchetto

Codice: Seleziona tutto

slackware aaa_base 14.1 i486 1 aaa_base-14.1-i486-1 ./slackware/a txz
patches xorg-server-xephyr 1.14.3 i486 3_slack14.1 xorg-server-xephyr-1.14.3-i486-3_slack14.1 ./patches/packages txz



Avete qualche soluzione per fare l'operazione più velocemente possibile?

Grazie

Re: performance grep -f

Inviato: lun giu 29, 2015 20:44
da ZeroUno
devo ancora approfondire, ma stranamente fare 1000 grep ed altre operazioni anzichè una grep -f sembra più veloce. bah.

Re: performance grep -f

Inviato: lun giu 29, 2015 21:24
da targzeta
Perché non ci posti i due file?

Emanuele

Re: performance grep -f

Inviato: mar giu 30, 2015 11:27
da ZeroUno
meglio, vi posto lo script:

la mia /var/log/packages è di 1418 pacchetti
il /var/lib/slackpkg/pkglist di 3587 pacchetti

Codice: Seleziona tutto

cd /var/log/packages ; time ls  |sed 's/$/.txz/' |awk -f /usr/libexec/slackpkg/pkglist.awk|awk '{print $1,$4}'|sed -r -e 's/ [0-9]+([^0-9].*)*$/ [^ ]\\+ [^ ]\\+ [0-9]\\+\1 /' -e 's/^/ /'|grep -f - /var/lib/slackpkg/pkglist >/tmp/pippo

su un i7 con disco ssd ha impiegato 5 minuti esatti


edit: comunque lo sto complicando perchè devo ottenere altri risultati ma paradossalmente sto migliorando le performance. Il concetto è che mi sto evitando un po' di espressioni regolari e limitando le feature volute (il tipo di output. Ma è ancora work-in-progress

Re: performance grep -f

Inviato: mar giu 30, 2015 19:37
da targzeta
Mi posti almeno il file pkglist? Io non ho slackpkg.

Emanuele

Re: performance grep -f

Inviato: mer lug 01, 2015 9:29
da ZeroUno
Eccolo, ma la grep è tutta da rifare perchè non tiene conto di alcune cose che devo rivedere, quindi l'output di quella grep non va bene.