Importa quantos arquivos eu mantenho em um único diretório? Em caso afirmativo, quantos arquivos em um diretório são muitos e quais são os impactos de ter muitos arquivos? (Isso está em um servidor Linux.)
Antecedentes: tenho um site de álbum de fotos e cada imagem carregada é renomeada para um ID de 8 dígitos hexadecimais (digamos, a58f375c.jpg). Isso é para evitar conflitos de nome de arquivo (se muitos arquivos "IMG0001.JPG" forem carregados, por exemplo). O nome do arquivo original e quaisquer metadados úteis são armazenados em um banco de dados. No momento, tenho algo em torno de 1500 arquivos no diretório de imagens. Isso faz com que a listagem dos arquivos no diretório (através do cliente FTP ou SSH) leve alguns segundos. Mas não vejo que isso tenha outro efeito além disso. Em particular, parece não haver impacto na rapidez com que um arquivo de imagem é veiculado para o usuário.
Pensei em reduzir o número de imagens criando 16 subdiretórios: 0-9 e af. Depois, movia as imagens para os subdiretórios com base no primeiro dígito hexadecimal do nome do arquivo. Mas não tenho certeza de que exista alguma razão para fazê-lo, exceto pela listagem ocasional do diretório por FTP / SSH.
fonte
Eu tive mais de 8 milhões de arquivos em um único diretório ext3. libc
readdir()
usado porfind
,ls
e a maioria dos outros métodos discutidos neste tópico para listar diretórios grandes.A razão
ls
e afind
lentidão nesse caso é quereaddir()
apenas lê 32K de entradas de diretório por vez, portanto, em discos lentos, serão necessárias muitas leituras para listar um diretório. Existe uma solução para esse problema de velocidade. Eu escrevi um artigo bastante detalhado sobre isso em: http://www.olark.com/spw/2011/08/you-can-list-a-directory-with-8-million-files-but-not-with- ls /A chave é: use
getdents()
diretamente - http://www.kernel.org/doc/man-pages/online/pages/man2/getdents.2.html em vez de qualquer coisa baseada na libc,readdir()
para que você possa especificar o buffer tamanho ao ler entradas de diretório do disco.fonte
Eu tenho um diretório com 88.914 arquivos nele. Como você, isso é usado para armazenar miniaturas e em um servidor Linux.
Os arquivos listados via FTP ou uma função php são lentos, sim, mas também há um impacto na exibição do arquivo. por exemplo, www.website.com/thumbdir/gh3hg4h2b4h234b3h2.jpg tem um tempo de espera de 200 a 400 ms. Como comparação em outro site, tenho cerca de 100 arquivos em um diretório, a imagem é exibida após apenas 40ms de espera.
Eu dei essa resposta, já que a maioria das pessoas acabou de escrever sobre o desempenho das funções de pesquisa de diretório, que você não usará em uma pasta miniatura - apenas exibindo arquivos estaticamente, mas estará interessado no desempenho de como os arquivos podem realmente ser usados. .
fonte
Depende um pouco do sistema de arquivos específico em uso no servidor Linux. Atualmente, o padrão é ext3 com dir_index, o que torna a busca em diretórios grandes muito rápida.
Portanto, a velocidade não deve ser um problema, além do que você já observou, que é que as listagens levarão mais tempo.
Há um limite para o número total de arquivos em um diretório. Parece-me que me lembro definitivamente trabalhando até 32000 arquivos.
fonte
dir_index
ativado. Eu tinha cerca de 17 milhões de arquivos no diretório. A resposta foi ativar olarge_dir
tune2fs.Lembre-se de que, no Linux, se você tiver um diretório com muitos arquivos, o shell poderá não conseguir expandir curingas. Eu tenho esse problema com um álbum de fotos hospedado no Linux. Ele armazena todas as imagens redimensionadas em um único diretório. Enquanto o sistema de arquivos pode lidar com muitos arquivos, o shell não pode. Exemplo:
ou
fonte
exec
implementação do sistema . Normalmente, o shell pode expandir bem o curinga - é a chamadaexec
com tantos argumentos que retorna o erro.Estou trabalhando em um problema semelhante agora. Temos uma estrutura hierárquica de diretórios e usamos IDs de imagem como nomes de arquivos. Por exemplo, uma imagem com
id=1234567
é colocada emusando os últimos 4 dígitos para determinar para onde o arquivo vai.
Com alguns milhares de imagens, você pode usar uma hierarquia de um nível. Nosso administrador de sistemas sugeriu não mais do que alguns milhares de arquivos em qualquer diretório (ext3) para eficiência / backup / quaisquer outros motivos que ele tivesse em mente.
fonte
Para o que vale a pena, eu apenas criei um diretório em um
ext4
sistema de arquivos com 1.000.000 de arquivos e, em seguida, acessei esses arquivos aleatoriamente através de um servidor web. Eu não notei nenhum prêmio em acessar aqueles com (digamos) apenas 10 arquivos lá.Isso é radicalmente diferente da minha experiência em fazer isso
ntfs
há alguns anos atrás.fonte
O maior problema que encontrei é em um sistema de 32 bits. Depois de passar um certo número, ferramentas como 'ls' param de funcionar.
Tentar fazer qualquer coisa com esse diretório depois de ultrapassar essa barreira se torna um grande problema.
fonte
Eu estou tendo o mesmo problema. Tentando armazenar milhões de arquivos em um servidor Ubuntu no ext4. Acabei de executar meus próprios benchmarks. Descobriu que o diretório simples tem um desempenho muito melhor e é muito mais simples de usar:
Escreveu um artigo .
fonte
Se o tempo envolvido na implementação de um esquema de particionamento de diretório for mínimo, eu sou a favor. Na primeira vez em que você precisar depurar um problema que envolva a manipulação de um diretório de 10000 arquivos por meio do console, você entenderá.
Como exemplo, o F-Spot armazena arquivos de fotos como AAAA \ MM \ DD \ filename.ext, o que significa que o maior diretório com o qual tive que lidar ao manipular manualmente minha coleção de ~ 20000 fotos é de cerca de 800 arquivos. Isso também torna os arquivos mais facilmente navegáveis a partir de um aplicativo de terceiros. Nunca assuma que o seu software é a única coisa que acessará os arquivos do seu software.
fonte
Depende absolutamente do sistema de arquivos. Muitos sistemas de arquivos modernos usam estruturas de dados decentes para armazenar o conteúdo dos diretórios, mas os sistemas de arquivos mais antigos costumavam adicionar as entradas a uma lista, portanto, recuperar um arquivo era uma operação O (n).
Mesmo se o sistema de arquivos estiver certo, ainda é absolutamente possível que os programas que listam o conteúdo do diretório atrapalhem e façam uma classificação O (n ^ 2), para que, por segurança, eu sempre limite o número de arquivos por diretório para não mais que 500.
fonte
Realmente depende do sistema de arquivos usado e também de alguns sinalizadores.
Por exemplo, o ext3 pode ter muitos milhares de arquivos; mas depois de alguns milhares, costumava ser muito lento. Principalmente ao listar um diretório, mas também ao abrir um único arquivo. Alguns anos atrás, ele ganhou a opção 'htree', que reduziu drasticamente o tempo necessário para obter um inode com um nome de arquivo.
Pessoalmente, uso subdiretórios para manter a maioria dos níveis abaixo de mil itens. No seu caso, eu criaria 256 diretórios, com os dois últimos dígitos hexadecimais do ID. Use os últimos e não os primeiros dígitos, para equilibrar a carga.
fonte
de fato, o ext3 possui limites de tamanho de diretório e eles dependem do tamanho do bloco do sistema de arquivos. Não há um "número máximo de arquivos" por diretório, mas um "número máximo de blocos por diretório usado para armazenar entradas de arquivos". Especificamente, o tamanho do diretório em si não pode crescer além de uma árvore b de altura 3, e o fanout da árvore depende do tamanho do bloco. Veja este link para alguns detalhes.
https://www.mail-archive.com/[email protected]/msg01944.html
Fui mordido por isso recentemente em um sistema de arquivos formatado com blocos de 2K, que estava inexplicavelmente recebendo mensagens do kernel com diretório completo
warning: ext3_dx_add_entry: Directory index full!
quando eu estava copiando de outro sistema de arquivos ext3. No meu caso, um diretório com apenas 480.000 arquivos não pôde ser copiado para o destino.fonte
A questão se resume ao que você fará com os arquivos.
No Windows, qualquer diretório com mais de 2k arquivos tende a abrir lentamente para mim no Explorer. Se forem todos arquivos de imagem, mais de 1k tendem a abrir muito lentamente na visualização em miniatura.
Ao mesmo tempo, o limite imposto pelo sistema era de 32.767. Agora está mais alto, mas mesmo assim há muitos arquivos para manipular ao mesmo tempo na maioria das circunstâncias.
fonte
O que a maioria das respostas acima não mostra é que não há uma resposta "tamanho único para todos" à pergunta original.
No ambiente atual, temos um grande conglomerado de diferentes hardwares e softwares - alguns de 32 bits, outros de 64 bits, outros de ponta e outros testados e verdadeiros - confiáveis e nunca mudando. Além disso, há uma variedade de hardware mais antigo e mais recente, sistemas operacionais mais antigos e mais novos, diferentes fornecedores (Windows, Unixes, Apple etc.) e uma infinidade de utilitários e servidores que acompanham. À medida que o hardware melhorou e o software foi convertido para compatibilidade de 64 bits, houve necessariamente um atraso considerável em fazer com que todas as partes deste mundo muito grande e complexo funcionassem bem com o ritmo acelerado das mudanças.
IMHO não há uma maneira de corrigir um problema. A solução é pesquisar as possibilidades e, por tentativa e erro, encontrar o que funciona melhor para suas necessidades específicas. Cada usuário deve determinar o que funciona para o sistema em vez de usar uma abordagem de cortador de biscoitos.
Por exemplo, tenho um servidor de mídia com alguns arquivos muito grandes. O resultado é apenas cerca de 400 arquivos preenchendo uma unidade de 3 TB. Apenas 1% dos inodes são usados, mas 95% do espaço total é usado. Outra pessoa, com muitos arquivos menores, pode ficar sem inodes antes que cheguem perto de preencher o espaço. (Como regra geral, nos sistemas de arquivos ext4, é utilizado 1 inode para cada arquivo / diretório.) Embora teoricamente o número total de arquivos que possam estar contidos em um diretório seja quase infinito, a praticidade determina que o uso geral determine unidades realistas, não apenas recursos do sistema de arquivos.
Espero que todas as diferentes respostas acima tenham promovido o pensamento e a solução de problemas, em vez de apresentar uma barreira insuperável ao progresso.
fonte
Lembro-me de executar um programa que estava criando uma enorme quantidade de arquivos na saída. Os arquivos foram classificados em 30000 por diretório. Não me lembro de ter problemas de leitura quando tive que reutilizar a saída produzida. Ele estava em um laptop Ubuntu Linux de 32 bits e até o Nautilus exibiu o conteúdo do diretório, embora depois de alguns segundos.
sistema de arquivos ext3: código semelhante em um sistema de 64 bits lida bem com 64000 arquivos por diretório.
fonte
"Depende do sistema de arquivos"
Alguns usuários mencionaram que o impacto no desempenho depende do sistema de arquivos usado. Claro. Sistemas de arquivos como o EXT3 podem ser muito lentos. Mas mesmo se você usar EXT4 ou XFS você não pode impedir que o listando uma pasta através de
ls
oufind
ou através de uma conexão externa como FTP vai se tornar mais lenta uma mais lenta.Solução
Prefiro da mesma maneira que @armandino . Para isso, uso essa pequena função no PHP para converter IDs em um caminho de arquivo que resulta em 1000 arquivos por diretório:
ou você pode usar a segunda versão se desejar usar caracteres alfanuméricos:
resultados:
Como você pode ver na
$int
versão -, cada pasta contém até 1000 arquivos e até 99 diretórios, contendo 1000 arquivos e 99 diretórios ...Mas não esqueça que muitos diretórios causam os mesmos problemas de desempenho!
Finalmente, você deve pensar em como reduzir a quantidade de arquivos no total. Dependendo do seu objetivo, você pode usar sprites CSS para combinar várias imagens minúsculas, como avatares, ícones, smilies, etc. No meu caso, eu tinha milhares de mini-caches e finalmente decidi combiná-los em pacotes de 10.
fonte
Respeito que isso não responda totalmente à sua pergunta sobre quantos são demais, mas uma idéia para resolver o problema a longo prazo é que, além de armazenar os metadados do arquivo original, também armazene em qual pasta do disco está armazenada - normalize fora esse pedaço de metadados. Depois que uma pasta cresce além de algum limite, você se sente à vontade para desempenho, estética ou qualquer outra razão, basta criar uma segunda pasta e começar a soltar arquivos lá ...
fonte
Eu tive um problema semelhante. Eu estava tentando acessar um diretório com mais de 10.000 arquivos. Estava demorando muito para criar a lista de arquivos e executar qualquer tipo de comando em qualquer um dos arquivos.
Pensei em um pequeno script php para fazer isso por mim mesmo e tentei descobrir uma maneira de impedir que o tempo acabasse no navegador.
A seguir está o script php que escrevi para resolver o problema.
Listando arquivos em um diretório com muitos arquivos para FTP
Como isso ajuda alguém
fonte
Não é uma resposta, mas apenas algumas sugestões.
Selecione um FS (sistema de arquivos) mais adequado. Desde um ponto de vista histórico, todos os seus problemas foram sábios o suficiente para ser uma vez central para os FSs evoluindo ao longo de décadas. Quero dizer, o FS mais moderno suporta melhor seus problemas. Primeiro, faça uma tabela de decisão de comparação com base no seu objetivo final da lista FS .
Eu acho que é hora de mudar seus paradigmas. Então, eu pessoalmente sugiro o uso de um FS com reconhecimento de sistema distribuído , o que significa que não há limites em relação ao tamanho, número de arquivos e etc. Caso contrário, mais cedo ou mais tarde você será desafiado por novos problemas imprevistos.
Não tenho certeza se vou funcionar, mas se você não mencionar algumas experiências, experimente o AUFS no sistema de arquivos atual. Eu acho que ele tem facilidades para imitar várias pastas como uma única pasta virtual.
Para superar os limites de hardware, você pode usar o RAID-0.
fonte
Não existe um número único que seja "demais", desde que não exceda os limites do sistema operacional. No entanto, quanto mais arquivos em um diretório, independentemente do sistema operacional, mais tempo leva para acessar qualquer arquivo individual e, na maioria dos sistemas operacionais, o desempenho é não linear; portanto, encontrar um arquivo entre 10.000 leva mais que 10 vezes mais em seguida, para encontrar um arquivo em 1.000.
Problemas secundários associados a muitos arquivos em um diretório incluem falhas de expansão de curinga. Para reduzir os riscos, considere solicitar seus diretórios por data de upload ou algum outro pedaço útil de metadado.
fonte