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:
- Obtenga el tamaño del archivo buscando hasta el final y haciendo
ftell()
; - Divide ese resultado por 2;
- Úselo
fseek()
para buscar esa ubicación; - Busque el comienzo de la siguiente línea llamando
getline()
una vez; - Úselo
strptime()
para saber en qué fecha se encuentra actualmente; - Haz una búsqueda binaria, repitiendo los pasos 4 y 5 hasta encontrar la línea que deseas.
Respuesta2
Podrías usarlo dd
en 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 * 1024
bytes de datos en fs * 1024
bytes 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 ?
.