Tengo que leer un archivo grande y antes de comenzar a leerlo, necesito saber el número total de líneas en el archivo (que están en millones).
He implementado muchas soluciones y he encontrado una. Pero durante mi búsqueda estaba pensando en ver cómo wc -l
funciona. No pude encontrar nada en Google.
Aunque he encontrado una solución a mi problema, todavía me gustaría saber cómo wc -l
funciona, ¡ya que puede calcular el número de líneas de un archivo con 92 millones de líneas en unos segundos!
¿Cómo?
Respuestas:
Lee todo el archivo y cuenta el número de finales de línea. Contar terminaciones de línea es realmente barato; la mayor parte del tiempo dedicado es leer el archivo. Si el archivo está (principalmente) en la memoria caché del búfer, también será barato. De lo contrario, dependerá de la velocidad de almacenamiento de su archivo.
En otras palabras, no hay magia.
fuente
WC solo lee el archivo en bloques de bytes sin procesar (preferiblemente en múltiplos del tamaño de bloque natural del sistema de archivos subyacente en el que se encuentra el archivo).
Luego solo escanea a través del búfer contando los caracteres de fin de línea. (También cuenta espacios, pestañas, feeds de formularios y otros caracteres especiales, en caso de que desee otra información que no sea la salida -l).
Leer desde el disco es la parte costosa en términos de velocidad. El escaneo del búfer lleva un tiempo descuidado en comparación con eso.
Supongamos que tiene 90 millones de líneas con un promedio de 100 caracteres por línea.
Eso es alrededor de 9.000.000.000 de caracteres o alrededor de 860 MB.
Una PC decente con una unidad SATA-3Gb / s lo hará en menos de 10 segundos. Incluso en un sistema de archivos relativamente lento con alguna otra actividad al mismo tiempo.
Una máquina rápida con algunos ajustes de rendimiento y un sistema de archivos optimizado puede hacerlo en menos de 5 segundos, incluso sin tener que recurrir a SATA-6G y una unidad SSD.
fuente
\n
) - "-l, --lines imprime los recuentos de nueva línea \ n \" - extraído dewc.c
wc -l
... lo siento ...Bienvenido al mundo del software libre. Siempre puedes mirar el código fuente
Aunque debo admitir que no soy un programador en C, entonces no soy el que realmente puede explicarte el código (y yo mismo estaría interesado).
Lo que sé es que, dado que wc no abre el archivo en sí, sino que le pide al sistema operativo que lo haga, esto depende en gran medida del sistema operativo y, por supuesto, de cómo se almacena el archivo. Aparte de eso, esperaría que las prácticas de programación correctas deben estar en su lugar, por ejemplo, no tratar de leer el archivo completo de una vez, etc.
fuente