Preciso ler um arquivo grande e, antes de começar a ler, preciso saber o número total de linhas no arquivo (que estão em milhões).
Eu implementei muitas soluções e encontrei uma. Mas durante a minha pesquisa eu estava pensando em ver como wc -l
funciona. Não encontrei nada no Google.
Embora tenha encontrado uma solução para o meu problema, ainda gostaria de saber como wc -l
funciona, pois ele pode calcular o número de linhas de um arquivo com 92 milhões de linhas em alguns segundos!
Quão?
Respostas:
Ele lê o arquivo inteiro e conta o número de terminações de linha. Contar terminações de linha é realmente barato; a maior parte do tempo gasto é lendo o arquivo. Se o arquivo estiver (principalmente) no cache do buffer, também será barato. Caso contrário, isso dependerá da velocidade do seu armazenamento de arquivos.
Em outras palavras, não há mágica.
fonte
O WC apenas lê o arquivo em blocos de bytes brutos (preferencialmente em múltiplos do tamanho natural do bloco do sistema de arquivos subjacente no qual o arquivo está localizado).
Depois, ele apenas varre o buffer, contando os caracteres de final de linha. (Também conta espaços, tabulações, feeds de formulário e outros caracteres especiais, caso você deseje 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 um tempo negligenciável em comparação com isso.
Digamos que você tenha 90 milhões de linhas com, em média, 100 caracteres por linha.
Isso significa cerca de 9.000.000.000 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 menos de 5 segundos, mesmo sem ter que recorrer ao SATA-6G e a uma unidade SSD.
fonte
\n
caracteres) - "-l, --lines imprimir as contagens de nova linha \ n \" - extraiu-se a partir dewc.c
wc -l
.. desculpe ...Bem-vindo ao mundo do software livre. Você sempre pode olhar para o código fonte
Embora eu deva admitir que não sou programador em C, não sou o único que pode explicar o código para você (e eu também ficaria 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, de como o arquivo é armazenado. Além disso, eu esperaria que práticas de programação corretas devessem estar em vigor, por exemplo, não tentando ler o arquivo como um todo de uma só vez, etc.
fonte