Como funciona o 'wc -l'?

9

Eu tenho que ler um arquivo grande e antes de começar a lê-lo, eu preciso saber o número total de linhas no arquivo (que estão em milhões).

Implementei muitas soluções e encontrei uma. Mas durante a minha pesquisa eu estava pensando em ver como o wc -l funciona. Não consegui encontrar nada no Google.

Embora eu tenha encontrado uma solução para o meu problema, ainda gostaria de saber como o wc -l funciona, já que ele pode calcular o número de linhas de um arquivo com 92 milhões de linhas em alguns segundos!

Como?

    
por detraveller 08.07.2013 / 19:03

3 respostas

19

Ele lê o arquivo inteiro e conta o número de finais de linha. Contar os finais de linha é muito barato; a maior parte do tempo gasto é lendo o arquivo. Se o arquivo estiver (na maior parte) no cache de buffer, isso também será barato. Caso contrário, isso dependerá da velocidade do seu armazenamento de arquivos.

Em outras palavras, não há mágica.

    
por 08.07.2013 / 19:07
7

O WC apenas lê o arquivo em blocos de bytes brutos (preferível em múltiplos do tamanho de bloco natural do sistema de arquivos subjacente no qual o arquivo está localizado).
Em seguida, apenas varre o buffer contando os caracteres de final de linha. (Ele também conta espaços, tabulações, feeds de formulários e outros caracteres especiais, apenas no caso de você desejar outras informações além da saída -l.)

A leitura do disco é a parte cara em termos de velocidade. A varredura do buffer leva tempo negligente comparado a isso.

Digamos que você tenha 90 milhões de linhas com, em média, 100 caracteres por linha. Isso é em torno de 9.000.000.000 de caracteres ou cerca de 860 MB.
Um PC decente com uma unidade SATA-3Gb / s fará isso em menos de 10 segundos. Mesmo em um sistema de arquivos relativamente lento, com alguma outra atividade acontecendo ao mesmo tempo.
Uma máquina rápida com algum ajuste de desempenho e um sistema de arquivos otimizado pode fazê-lo em 5 segundos, mesmo sem ter que recorrer ao SATA-6G e a uma unidade SSD.

    
por 08.07.2013 / 20:03
3

Bem-vindo ao mundo do software livre. Você sempre pode consultar o código-fonte

Embora eu deva admitir que eu não sou um programador C, então eu não sou o único que pode realmente explicar o código para você (e eu seria ser eu mesmo interessado).

O que eu sei é que como o wc não abre o arquivo em si, mas pede ao SO para fazê-lo, isso depende muito do SO e, é claro, como o arquivo é armazenado. Além disso, eu esperaria que as práticas corretas de programação devessem estar em vigor, por ex. não tentando ler o arquivo inteiro de uma só vez, etc.

    
por 08.07.2013 / 19:18