bash - tamaño - que archivos ocupan mas espacio en mi disco duro linux
¿Expandir un archivo enorme(80 GB) de alguna manera para acelerarlo? (5)
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 sintaxis que se pueda mejorar, (por ejemplo, refregar, fgurar mejor?)
El archivo está realmente en un directorio que se comparte con un montaje 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
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
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.
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.
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
.
< 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.