Tengo alrededor de 3000 archivos de 300 MB cada uno y me gustaría buscarlos para una serie de subcadenas lo más rápido posible con mi servidor de 16 núcleos.
Esto es lo que intenté pero no parece paralelizar la búsqueda de archivos.
sudo find /mnt2/preprocessed/preprocessed/mo* | sudo xargs awk '/substring/ {c++} END {print c}' | paste -sd+ | bc
Está pegado de diferentes procedimientos, no lo entiendo del todo. ¿Tiene alguna sugerencia sobre cómo puedo dividir el procesamiento de archivos?
Respuesta1
- Vea si tiene el
parallel
programa en su sistema. (Puede provenir de GNU). Si es así, descubra cómo usarlo. De lo contrario, - Ejecute su
find
salida con un archivo. Utilizando un editor de texto, o posiblemente un script que utilice herramientas comohead
, divida ese archivo en 16 archivos fragmentados con (aproximadamente) el mismo número de líneas (es decir, haciendo referencia a un número igual de archivos encontrados). Luego inicie 16awk … | paste … | bc
oleoductos; uno para cada archivo de fragmento. (Y sume los 16 resultados).
Me pregunto por qué estás usando awk
para contar las apariciones de una cadena cuando grep -c
está diseñada específicamente para hacerlo.
Respuesta2
GNU paralelo es bastante compatible con xargs, en su caso puede reemplazarlo. Si solo cuenta las ocurrencias de substring
uso grep -c
comoScottsugiere:
sudo find /mnt2/preprocessed/preprocessed/mo* |
sudo parallel grep -c source | paste -sd+ | bc
Tenga en cuenta que algunas versiones de GNU/Linux instalan GNU paralelo en modo compatible "Paralef de Tollef". Puede cambiar eso agregando --gnu
a la línea de comando argumentos en paralelo. Para que el cambio sea permanente, agregue --gnu
a ~/.parallel/config
.