grep -i -A 5 -B 5 'db_pd.Clients' eightygigsfile.sql
Esto se ha estado ejecutando durante una hora en un servidor Linux bastante potente que de otra manera no está sobrecargado. ¿Alguna alternativa a grep? Cualquier cosa sobre mi sintaxis que pueda mejorarse (¿egrep, fgrep mejor?)
El archivo está realmente en un directorio que se comparte con un montaje en otro servidor, pero el espacio en disco real es local, por lo que no debería hacer ninguna diferencia.
el grep está tomando hasta el 93% de la CPU
-i
conmutador puede ralentizar el proceso, intente sin-i
o conLC_ALL=C grep ...
. Además, si solo está buscando una cadena fija, usegrep -F
.cindex .
para indexar su carpeta actual, entoncescsearch db_pd.Clients
.Respuestas:
Aquí hay algunas opciones:
1) Prefije su comando grep con
LC_ALL=C
para usar la configuración regional C en lugar de UTF-8.2) Úselo
fgrep
porque está buscando una cadena fija, no una expresión regular.3) Elimine la
-i
opción, si no la necesita.Entonces tu comando se convierte en:
También será más rápido si copia su archivo al disco RAM.
fuente
grep -F
más quefgrep
LANG=C
(en lugar deLC_ALL=C
) es suficiente y es más fácil de escribir.fgrep
es otra forma de escribirgrep -F
, comoman fgrep
te diré. Algunas versionesman
también dicen que la primera está en desuso para la segunda, pero la forma más corta es demasiado conveniente para morir.Si tiene una CPU multinúcleo, realmente recomendaría GNU en paralelo . Para grep de un archivo grande en uso paralelo:
Dependiendo de sus discos y CPU, puede ser más rápido leer bloques más grandes:
No está del todo claro a partir de su pregunta, pero otras opciones
grep
incluyen:-i
bandera.-F
bandera para una cuerda fijaLANG=C
-m
bandera.fuente
--pipepart
lugar de--pipe
. Es mucho mas rapido.<
carácter que precede al comando paralelo?cat file.sql | parallel ...
pero evita un UUOC . GNU paralelo también tiene una forma de leer la entrada de un archivo usandoparallel ... :::: file.sql
. HTH.Alguna mejora trivial:
Elimine la opción -i, si puede, no distingue entre mayúsculas y minúsculas es bastante lento.
Reemplazar
.
por\.
Un solo punto es el símbolo de expresión regular para que coincida con cualquier carácter, que también es lento
fuente
Dos líneas de ataque:
-i
o tiene la posibilidad de deshacerse de él?grep
es de un solo subproceso, por lo que es posible que desee iniciar más de ellos en diferentes desplazamientos.fuente
Si necesita buscar varias cadenas, grep -f strings.txt ahorra mucho tiempo. Lo anterior es una traducción de algo que estoy probando actualmente. el valor de la opción -j y -n parecía funcionar mejor para mi caso de uso. El grep -F también marcó una gran diferencia.
fuente