Quantos arquivos em um diretório são muitos? (Baixando dados da rede)

19

Saudações,

Estou escrevendo alguns scripts para processar imagens de vários sites de fotos. No momento, estou armazenando todos esses dados em arquivos de texto individuais no mesmo diretório.

O diretório é acessível na web. Um usuário final faz uma chamada para um serviço da web que retorna o caminho para o arquivo que o usuário precisará.

Eu queria saber em que estágio eu veria um impacto no desempenho por ter todos esses arquivos no mesmo diretório? (Caso existam)

Steve
fonte

Respostas:

12

O desempenho varia de acordo com o sistema de arquivos que você está usando.

  • FAT: esqueça :) (ok, acho que o limite é de 512 arquivos por diretório)
  • NTFS: Embora ele possa armazenar 4 bilhões de arquivos por pasta, ele é degradado rapidamente - cerca de mil você começará a notar problemas de desempenho, vários milhares e verá o explorador parecer travar por um bom tempo.
  • EXT3: o limite físico é de 32.000 arquivos, mas o perf também sofre vários milhares de arquivos.

  • EXT4: teoricamente ilimitado

  • ReiserFS, XFS, JFS, BTRFS: esses são bons para muitos arquivos em um diretório, pois são mais modernos e projetados para lidar com muitos arquivos (os outros foram projetados nos dias em que os HDDs eram medidos em MB e não em GB) . O desempenho é muito melhor para muitos arquivos (junto com o ext4), pois ambos usam um algoritmo de tipo de pesquisa binária para obter o arquivo desejado (os outros usam um mais linear).

gbjbaanb
fonte
6
Isto está errado. Não há um limite de 32000 arquivos no EXT3. Há um limite de 32000 subdiretórios. Eu tenho um diretório aqui com mais de 300000 arquivos e ele executa bem.
Davidsheldon em
1
é bem verdade - o limite de arquivos é o limite inteiro do sistema de arquivos em inodes, mas você está limitado a 32k links (ou seja, subdiretórios).
Gbjbaanb
A declaração do NTFS atual também não é verdadeira, pode conter até 4.294.967.295 (2 ^ 32 - 1): technet.microsoft.com/en-us/library/cc781134%28WS.10%29.aspx
Fleshgrinder
NÃO confunda subdiretórios com arquivos, na máquina CentOS eu tinha 32000 subdiretórios, atingi o limite, movi todos os ARQUIVOS nesse diretório e ainda funciona bem.
precisa saber é o seguinte
8

Eu armazeno imagens para exibição em um servidor da web e tenho mais de 300.000 imagens em um diretório no EXT3. Não vejo problemas de desempenho. Antes de configurar isso, eu fiz testes com 500k imagens em um diretório e acessando arquivos aleatoriamente por nome, e não houve uma desaceleração significativa com 500k sobre 10k imagens no diretório.

A única desvantagem que vejo é que, para sincronizar os novos com um segundo servidor, tenho que executar rsynctodo o diretório e não posso dizer apenas para sincronizar um subdiretório que contém os mais recentes mil.

davidsheldon
fonte
Bem, para sincronizar com um segundo servidor, acho que você deve criar uma estrutura e um algoritmo que mantenha as alterações, então esse log poderá economizar uma grande quantidade de tempo.
Bahadir Tasdemir 13/03/16
+1 Isso realmente responde à pergunta.
kubanczyk
Uma desvantagem: se você usa um cliente FTP como o FileZilla e deseja listar o conteúdo da pasta, leva um tempo.
Kai Noack
3

A quantidade de arquivos em uma pasta poderia teoricamente ser ilimitada. No entanto, sempre que o sistema operacional acessar a pasta específica para procurar arquivos, ele deverá processar todos os arquivos da pasta. Com menos de 500 arquivos, você pode não notar atrasos. Mas quando você tem dezenas de milhares de arquivos em uma única pasta, um simples comando de lista de pastas (ls ou dir) pode demorar muito. Quando essas pastas puderem ser acessadas via FTP, será realmente muito lento ...

Os problemas de desempenho não dependem realmente do sistema operacional, mas da velocidade do processador do sistema, da capacidade do disco e da memória. Se você tiver muitos arquivos, convém combiná-los em um único arquivo e usar um sistema de arquivamento otimizado para armazenar muitos dados. Pode ser um arquivo ZIP, mas, melhor ainda, armazene-o como blobs em um banco de dados com o nome do arquivo como chave primária.

Wim ten Brink
fonte
Mas o acesso ao arquivo removerá diretamente os gargalos com a busca nos diretórios ou o acesso a um diretório ainda terá uma chamada de pesquisa subjacente? (Linux, debian)
steve
3
Acessar o arquivo diretamente atenuará esses problemas. Eu fiz testes no ext3, e acessar um arquivo pelo nome em um diretório que contém 500000 arquivos não é significativamente mais lento que o que contém 1000. Obviamente, fazer isso lsé um problema.
Davidsheldon em
Ao saber o nome exato, o acesso deve ser rápido. O problema seria principalmente qualquer código ou comando que deseja obter uma lista de arquivos.
Wim ten Brink
1

Minha regra geral é dividir pastas se houver mais de 1000 arquivos e a pasta for navegada (por exemplo, através da Internet ou do Explorer) ou 5000 arquivos.

Bip Bip
fonte
0

Como aponta @skaffman, os limites dependem do sistema operacional. É provável que você seja afetado por limites em sistemas operacionais mais antigos. Lembro que uma versão antiga do Solaris estava limitada a 32768 arquivos por diretório.

A solução usual é usar algum tipo de hash, ou seja, o servidor Cyrus imap divide os usuários por um hash alfabético:

/var/spool/imap/a/user/anna/
/var/spool/imap/a/user/albert/
/var/spool/imap/d/user/dan/
/var/spool/imap/e/user/ewan/
diciu
fonte
1
Obrigado, eu definitivamente colocaria algo no lugar quando um diretório tiver mais de 2k arquivos! :)
steve
Esta pergunta tem algumas respostas boas: serverfault.com/questions/95444/…
davey
Minha regra geral é que mais de 20.000 arquivos em um diretório não são uma boa ideia. A maioria dos sistemas de arquivos modernos aceita esses arquivos. Depois de encontrar os arquivos de 32k em um diretório, alguns sistemas de arquivos como o ext3 começarão a ter sérios problemas de desempenho.
Phil Hollenback
Phil - você tem alguma informação sobre problemas de desempenho com mais de 32k arquivos com ext3, não estou vendo nenhum com mais de 300k? Talvez seja algo que não esteja afetando meu padrão de uso.
Davidsheldon em
No meu trabalho anterior, o software científico gerava muitos arquivos pequenos (poucos k cada) em um diretório. Definitivamente vimos que, para> 32k, o tempo de leitura do diretório aumentaria enormemente. Apenas executar 'ls' em um diretório com tantos arquivos levaria um minuto ou mais.
Phil Hollenback
0

Se você estiver acessando diretamente um arquivo, o número de arquivos em um diretório não será um problema de velocidade.

O número de arquivos que você pode criar em um único diretório depende do sistema de arquivos que você está usando. Se você estiver listando todos os arquivos no diretório ou pesquisando, classificando etc., com muitos arquivos, essas operações serão mais lentas.

gbjbaanb está errado em sua resposta sobre o tamanho máximo do arquivo ext3. Geralmente ext limita o número de arquivos no seu disco em geral. Você não pode criar mais arquivos, pois possui inodes na sua tabela de inodes. Ele está correto ao sugerir reiserfs para obter mais desempenho com muitos arquivos

Janusz
fonte
0

Pasta marcada com arquivos de 10K em NTFS (Windows 7, 64 bits). A pasta com 10 mil imagens em qualquer visualização (lista, ícone etc.) funciona e rola sem nenhum atraso sensível.

Vil
fonte