¿Cómo empezar a procesar un archivo con un desplazamiento?

¿Cómo empezar a procesar un archivo con un desplazamiento?

Caso de uso: tiene un archivo de registro de varios GB durante toda una semana y necesita buscar algo que sucedió el sábado usando, por ejemplo grep, . Haciendo una suposición fundamentada, asume que comenzar la búsqueda desde la mitad del archivo reducirá a más de la mitad el tiempo de procesamiento (ya que definitivamente no tendrá que procesar todo el resto del archivo) sin omitir ningún dato relevante. es posible?

Respuesta1

Suponiendo que sus datos estén en orden cronológico:

  1. Obtenga el tamaño del archivo buscando hasta el final y haciendo ftell();
  2. Divide ese resultado por 2;
  3. Úselo fseek()para buscar esa ubicación;
  4. Busque el comienzo de la siguiente línea llamando getline()una vez;
  5. Úselo strptime()para saber en qué fecha se encuentra actualmente;
  6. Haz una búsqueda binaria, repitiendo los pasos 4 y 5 hasta encontrar la línea que deseas.

Respuesta2

Podrías usarlo dden la línea de:

dd if=log skip=xK bs=1M

lo que omitiría x * 1024 bloques de tamaño 1M (2^20). Consulte dd(1)para obtener detalles sobre su manejo de unidades.

Si desea automatizar la búsqueda binaria, suponiendo que su registro tenga el formato habitual <date> [data]al que puede canalizar la salida head -n 2, verifique la fecha al comienzo delsegundolínea (que, bajo el supuesto razonable de colas "normalmente" largas, estará completa) y decida qué mitad quiere.

Respuesta3

Obtenga el tamaño del archivo y divídalo por 2. Divida eso por 1024 para obtener KiB. (O 1024*1024 para obtener MiB, etc.)

((fs = $(stat -c %s logfile) / 2 / 1024))

Saltar y buscar

dd if=logfile bs=1024 skip=$fs | grep blahblah

Podría ampliar aún más esto, si el archivo de registro esmuyconsistente con la cantidad de datos pr. día agregando un count=valor a dd.

((cnt = $(stat -c %s logfile) / 5 / 1024))

dd if=logfile bs=1024 skip=$fs count=$cnt | grep blahblah

Eso canalizaría cnt * 1024bytes de datos en fs * 1024bytes desplazados.

Envuélvalo todo en un script y realice la canalización fuera del script para grep, un archivo temporal o lo que quiera.

Respuesta4

No está muy claro qué es exactamente lo que quieres hacer y a qué te refieres con mi "proceso". Para archivos grandes mi programa interactivo favorito es less. Maneja archivos grandes sin problemas. También puede saltar a un porcentaje particular, por ejemplo, usando 30%. Además, puedes buscar usando /y ?.

información relacionada