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)
Respostas:
O desempenho varia de acordo com o sistema de arquivos que você está usando.
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).
fonte
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
rsync
todo o diretório e não posso dizer apenas para sincronizar um subdiretório que contém os mais recentes mil.fonte
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.
fonte
ls
é um problema.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.
fonte
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:
fonte
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
fonte
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.
fonte