Benchmark leitura de pastas com muitos arquivos

Olá a todos.

Este post é uma continuação ao post de geração de muitos arquivos em uma única pasta.

Após verificar o tempo de geração de arquivos em uma única pasta aproveitei para fazer uma segunda medição: Qual o tempo de leitura de arquivos em uma pasta com diferentes números de arquivos?

Para este exemplo, executei a rotina apenas no Ubuntu 12.04.

O algoritmo executado aproveitava os arquivos gerados do post anterior e gera um número aleatório que coincide com um arquivo na pasta. Esta rotina foi repetida, um certo número de vezes, para se chegar a um tempo médio de leitura. Os testes foram executados para cada uma das pastas geradas.

A tabela abaixo representa os dados medidos:

Interações Arquivos Tempo (mS)
1.000 10 0,377
1.000 1.000 0,864
1.000 1.000.000 0,783
1.000 10.000.000 0,868
1.000.000 10.000.000 0,399

Num primeiro momento podemos verificar (e que a maioria deve saber) que é mais rápido ler do que gravar arquivos.

O mais importante a ser verificado é o tempo constante de leitura. Os tempos menores podem se valer de algum recurso do sistema operacional, tal como cache ou outras funcionalidades do IO.

Nas primeiras medições foram executados loops de mil interações lendo nas diferentes pastas. O tempo aumenta muito pouco conforme aumentamos o número de arquivos nas pastas. Este tempo esta na ordem de 0.1 mS ou seja 0.0001 S. Para a grande maioria das aplicações, podemos considerar como irrelevante o tempo de leitura em pastas com muitos arquivos.

Por fim, um teste extremo foi executado, iterando 1 milhão de vezes na pasta que continha 10 milhões de arquivos. Surpreendentemente o tempo médio de leitura diminuiu, certamente por conta de recursos de IO do SO.

Bom pessoal, eu gostei muito de ter realizado estas medições, pois não tenho dúvidas: O tempo de gravação e leitura de arquivos em pastas que contenham muitos deles, aumenta mas numa proporção que não é relevante para a grande maioria das aplicações.

 

Um abraço.

Benchmark gerar arquivos numa unica pasta no Windows e Ubuntu

Olá.

Por diferentes razões, podemos nos deparar com situações onde é necessário criar arquivos em disco para fins de cache, armazenamento, etc.

O problema é que dependendo do caso, começa a aumentar a complexidade para manutenção nesta estrutura, caso uma única pasta contenha uma quantidade muito grande de arquivos.

Este post vem para responder uma dúvida que algumas vezes vinha a tona nesta discussões: Afinal, criar milhares e até milhões de arquivos em uma única pasta, prejudica o desempenho do file system?

Até o final do post poderemos responder esta questão. Para nos ajudar, foi escrito um programa na linguagem Java que irá gerar uma grande quantidade de arquivos numa única pasta. O arquivo gerado continha uma sequência numérica e ocupava 1Kbyte. Para fins de comparação, a rotina foi executa em 2 SO (Windows 7 e Ubuntu 12.04).

Vale afirmar ainda que os dados foram gravados numa partição formatada em NTFS.

Antes de começarmos, gostaria de ressaltar alguns pontos:

  • A linguagem Java foi escolhida meramente por facilidade. Escrever o programa em outras linguagens como o C irá acarretar em ganho de performance.
  • O objetivo do post não é provar qual SO é mais rápido. Não foram tomadas medidas para garantir um cenário semelhante na execução dos testes. Os dados gerados são aproximados e não devem ser tomados como verdades absolutas.

Dito isso, vamos ao que importa.

A rotina criada consistia num loop que criava os arquivos numa pasta pré-definida e calculava o tempo médio de criação dos arquivos.

Foram executados 4 testes diferentes que se diferenciavam pelo número de arquivos gerados: 10, 1.000, 1.000.000 e 10.000.000.

Ubuntu 12.04

O Ubuntu instalado é o 12.04  e não entrarei em detalhes sobre o kernel do linux que o mesmo executa.

A tabela abaixo apresenta os dados de cada uma das execuções.

Ubuntu
Execuções Tempo Total Média(s) Média(ms)
10 0,005 0,0005 0,5
1.000 0,933 0,000933 0,933
1.000.000 956,158 0,000956 0,956158
10.000.000 11846,077 0,001185 1,1846077

Podemos observar um pequeno crescimento do tempo médio de execução. Observe o gráfico abaixo:

 

ubuntu1

Podemos observar que realmente ocorre um aumento no tempo de criação dos arquivos no file system. Como o tempo apresentado é a média, a geração dos arquivos no file system leva mais tempo do que o apresentado na imagem. Mas a ideia é verificar que sim, existe um aumento no tempo da criação, mas este aumento se da na ordem de milisegundos.

 

Windows

Vamos observar agora se o Windows mantém um comportamento parecido. Segue os dados colhidos:

Windows
Execuções Tempo Total Média(s) Média(ms)
10 0,006 0,0006 0,6
1.000 0,87 0,00087 0,87
1.000.000 852,871 0,000853 0,852871
10.000.000 8005,498 0,000801 0,8005498

Abaixo o gráfico:

windows

Podemos verificar que com o Windows, ocorre um comportamento curioso: No teste executado, o tempo médio de criação diminuiu conforme aumentamos a quantidade de arquivos.

 

Conclusão

Inicialmente vamos responder aquela pergunta lá do início do post:

Afinal, criar milhares e até milhões de arquivos em uma única pasta, prejudica o desempenho do file system?

E surpreendentemente a resposta a ser dada é: Não. Mesmo no caso do Ubuntu, o tempo médio aumentou numa escala pequena. Para a grande parte de aplicações este tempo não deve ser crítico. Claro que em alguns casos, este tempo pode ser considerado.

Em linhas gerais, consegui tirar minha dúvida, ambos os SO conseguem administrar o File System de maneira eficiente, e a gravação do arquivo não levou muito mais tempo.

Obviamente que manipular estes arquivos para tarefas como cópia e listagem irá ficar lento pela quantidade de arquivos.

 

Algumas considerações finais:

Me espantou o fato de o Windows diminuir o tempo e a diferença de tempo entre eles. Vale mencionar aqui que a execução no Windows ocorreu com mais recursos da máquina disponíveis. Quando gerei os arquivos no Ubuntu estava utilizando o Navegador e escutando Música. Mais uma vez, o objetivo era verificar se iria ocorrer um aumento significativo e não obter um tempo preciso.

Um abraço.