¿Expandir un archivo enorme (80 GB) de alguna manera para acelerarlo?

grep -i -A 5 -B 5 'db_pd.Clients' eightygigsfile.sql 

Esto ha estado funcionando durante una hora en un servidor linux bastante poderoso que de lo contrario no está sobrecargado. ¿Alguna alternativa a grep? ¿Algo sobre mi syntax que se pueda mejorar, (por ejemplo, refregar, fgurar mejor?)

El archivo está realmente en un directorio que se comparte con un assembly en otro servidor, pero el espacio de disco real es local, por lo que no debería haber ninguna diferencia.

el grep está capturando hasta un 93% de CPU

Aquí hay algunas opciones:

1) Prefijo el comando grep con LC_ALL=C para usar la configuración regional C en lugar de UTF-8.

2) Use fgrep porque está buscando una cadena fija, no una expresión regular.

3) Elimine la opción -i , si no la necesita.

Entonces tu comando se convierte en:

 LC_ALL=C fgrep -A 5 -B 5 'db_pd.Clients' eightygigsfile.sql 

También será más rápido si copia su archivo en el disco RAM.

Si tienes una CPU multinúcleo, realmente recomendaría GNU paralelo . Para grep un archivo grande en uso paralelo:

 < eightygigsfile.sql parallel --pipe grep -i -C 5 'db_pd.Clients' 

Dependiendo de sus discos y CPU, puede ser más rápido leer bloques más grandes:

 < eightygigsfile.sql parallel --pipe --block 10M grep -i -C 5 'db_pd.Clients' 

No está del todo claro por tu pregunta, pero otras opciones para grep incluyen:

  • Soltando la bandera -i .
  • Usando el indicador -F para una cadena fija
  • Desactivando NLS con LANG=C
  • Establecer un número máximo de coincidencias con el indicador -m .

Alguna mejora trivial:

  • Quite la opción -i, si puede, la distinción entre mayúsculas y minúsculas es bastante lenta.

  • Reemplace el . por \.

    Un solo punto es el símbolo de la expresión regular para que coincida con cualquier carácter, que también es lento

Dos líneas de ataque:

  • ¿Estás seguro, necesitas el -i , o tienes la posibilidad de deshacerte de él?
  • ¿Tienes más núcleos para jugar? grep tiene un único subproceso, por lo que es posible que desee iniciar más de ellos en diferentes desplazamientos.
 < eightygigsfile.sql parallel -k -j120% -n10 -m grep -F -i -C 5 'db_pd.Clients' 

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 pareció funcionar mejor para mi caso de uso. El -F grep también hizo una gran diferencia.