Eu tenho um aplicativo gravando em um diretório ext3 que ao longo do tempo cresceu para aproximadamente três milhões de arquivos. Escusado será dizer que a leitura da lista de arquivos deste diretório é insuportavelmente lenta.
Não culpo o ext3. A solução adequada seria deixar o código do aplicativo gravar em subdiretórios, como em ./a/b/c/abc.ext
vez de usar apenas ./abc.ext
.
Estou mudando para uma estrutura de subdiretório e minha pergunta é simplesmente: aproximadamente quantos arquivos devo armazenar em um diretório ext3 enquanto ainda obtendo desempenho aceitável? Qual a sua experiência?
Ou em outras palavras; assumindo que preciso armazenar três milhões de arquivos na estrutura, quantos níveis de profundidade a ./a/b/c/abc.ext
estrutura deve ter?
Obviamente, essa é uma pergunta que não pode ser respondida exatamente, mas estou procurando uma estimativa do parque.
http://en.wikipedia.org/wiki/Ext3#Functionality - menciona que um diretório pode ter apenas aproximadamente 32000 subdiretórios, mas não faz menção a arquivos.
http://roopindersingh.com/2008/05/10/ext3-handling-large-number-of-files-in-a-directory/
Além disso, eu odeio o Experts Exchange, mas li um comentário sobre essa questão de que é ideal ter menos de 10 a 15.000 por diretório.
fonte
Posso confirmar em um servidor bastante poderoso, com muita memória sob uma carga decente, que 70.000 arquivos podem causar todo tipo de confusão. Fui remover uma pasta de cache com 70k arquivos e o apache começou a gerar novas instâncias até atingir o limite máximo em 255 e o sistema usou toda a memória livre (16GB, embora a instância virtual possa ter sido menor). De qualquer forma, mantê-lo abaixo de 25.000 é provavelmente uma atitude muito prudente
fonte
Na minha experiência, a melhor abordagem é não projetar demais a estrutura do arquivo com antecedência. Como mencionado em pelo menos uma outra resposta, existem extensões do sistema de arquivos que lidam com o fim das questões de desempenho.
O problema que eu mais acertei é a usabilidade no lado administrativo. A menor quantidade de trabalho que você pode fazer para diminuir o número de arquivos em um diretório é provavelmente a abordagem que você precisa agora.
sqrt (3_000_000) == 1732
Alguns milhares de arquivos em um único diretório parecem razoáveis para mim. Seja seu próprio juiz para sua própria situação. Para conseguir isso, tente dividir os arquivos em um único nível de diretórios hash, para que o número médio de arquivos por diretório seja aproximadamente o mesmo que o número de diretórios.
Dado o seu exemplo disso seria
./a/abc.ext
,./ab/abc.ext
,./abc/abc.ext
, ....A distribuição dos arquivos dependerá muito dos nomes de arquivos reais. Imagine aplicar essa técnica a um diretório com um milhão de arquivos nomeados cada um
foobar???.txt
. Existem maneiras de obter uma propagação mais uniforme, como o hash baseado no valor de um número específico de bits da soma MD5 de cada nome de arquivo, mas vou ousar supor que isso seria um exagero para o que você está tentando realizar.fonte
Hmm, eu li este artigo recentemente . Essencialmente, você aproveita a distribuição do seu algoritmo de hash favorito. Comecei a tocar com os números, um INT assinado pelo MySQL tem um valor máximo de 2147483647. Você também pode variar o número desejado de arquivos por diretório e o número de subdiretórios para definir o número final de subdiretórios / arquivos- por diretório dividido para um determinado conjunto de dados, mas é difícil encontrar evidências empíricas sobre organizações ideais de diretório / arquivo. Este artigo fornece algumas dicas sobre as diferenças de desempenho nos sistemas de arquivos (algumas métricas interessantes), mas nada sobre as organizações ideais.
fonte
Eu acho que você está pensando muito nisso. Se você escolher um único nível adicional de diretórios e conseguir equilibrar as coisas de maneira uniforme, terá 1732 * diretórios e 1732 arquivos por diretório.
A menos que você planeje precisar de dezenas de bilhões de arquivos, poderá escolher um número entre 1000 e 100.000 e obter bons resultados.
* raiz quadrada de 3 milhões.
fonte