Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

198
Vistas
AWK muy lento al dividir un archivo grande según el valor de la columna y usar el comando de cierre

Necesito dividir un archivo de registro grande en otros más pequeños según la identificación que se encuentra en la primera columna, esta solución funcionó de maravilla y muy rápido durante meses:

 awk -v dir="$nome" -F\; '{print>dir"/"dir"_"$1".log"}' ${nome}.all;

Donde $nome es un nombre de archivo y directorio.

Es muy rápido y funcionó hasta que el archivo de registro alcanzó varios millones de líneas +2 GB de archivo de texto, luego comenzó a mostrar

 "Too many open files"

De hecho, la solución es muy simple, agregando el comando de cierre:

 awk -v dir="$nome" -F\; '{print>dir"/"dir"_"$1".log"; close(dir"/"dir"_"$1".log")}' ${nome}.all;

El problema es que ahora es MUY lento, tarda una eternidad en hacer algo que se hizo en segundos y necesito optimizarlo.

AWK no es obligatorio, puedo usar una alternativa, simplemente no sé cómo

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

No probado ya que no proporcionó ninguna entrada/salida de muestra para probar, pero esto debería hacerlo:

 sort -t';' -k1,1 "${nome}.all" | awk -v dir="$nome" -F\; '$1!=prev{close(out); out=dir"/"dir"_"$1".log"; prev=$1} {print > out}'

Su primer guión:

 awk -v dir="$nome" -F\; '{print>dir"/"dir"_"$1".log"}' ${nome}.all;

tenia 3 problemas:

  1. No estaba cerrando los nombres de los archivos a medida que avanzaba y, por lo tanto, excedió el umbral que vio.
  2. Tenía una expresión sin paréntesis en el lado derecho de la redirección de salida que es un comportamiento indefinido según POSIX.
  3. No estaba citando la variable de shell ${nome} en el nombre del archivo.

Vale la pena mencionar que gawk podría manejar 1 y 2 sin fallar, pero se ralentizaría a medida que creciera la cantidad de archivos abiertos y tuviera que administrar las aperturas/cierres internamente.

Su segundo guión:

 awk -v dir="$nome" -F\; '{print>dir"/"dir"_"$1".log"; close(dir"/"dir"_"$1".log")}' ${nome}.all;

aunque ahora cerró el nombre del archivo de salida, todavía tenía los problemas 2 y 3 y luego agregó 2 nuevos problemas:

  1. Estaba abriendo y cerrando los archivos de salida una vez por línea de entrada en lugar de solo cuando el nombre del archivo de salida tenía que cambiar.
  2. Estaba sobrescribiendo el archivo de salida por cada $ 1 por cada línea escrita en él en lugar de agregarlo.

Lo anterior supone que tiene varias líneas de entrada para cada $1, por lo que cada archivo de salida tendrá varias líneas. De lo contrario, la desaceleración que vio al cerrar los archivos de salida no habría ocurrido.

La sort anterior podría reorganizar el orden de las líneas de entrada para cada $1. Si eso es un problema, agregue -s para "clasificación estable" si tiene clasificación GNU o infórmenos, ya que es fácil de solucionar con las herramientas POSIX.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda