Armazenando arquivos em um diretório ... existem limites?

3

Estou usando o CentOS 5 com o Plesk 9 (64 bits), estou executando um site onde os usuários farão o upload de fotos. Com um sistema operacional de 64 bits, há algum limite para quantos arquivos posso armazenar? Tudo o que me interessa é desempenho e servir os arquivos. Eu prefiro não ter 4 diretórios de arquivos espalhados. No entanto, espero que em algum momento eu possa ter 200-300 mil imagens.

    
por Mike Curry 03.06.2009 / 22:05

9 respostas

6

Se você estiver usando o ext3 , encontrei esta citação (aviso: site em espanhol)

"There is a limit of 32k (32768) subdirectories in a single directory, a limitation likely of only academic interest, as many people don't even have that many files (though huge mail servers may need to keep that in mind). The ext2 inode specification allows for over 100 trillion files to reside in a single directory"

Outras leituras mostraram que o ext3 não tem uma limitação de 32K, que pode ser provada empiricamente com

a=0; i=1; while [ $a == 0 ]; do touch $i; a=$?; let i++; done

mas tem um limite de pasta de 32K para pasta, que pode ser testado com

a=0; i=1; while [ $a == 0 ]; do mkdir $i; a=$?; let i++; done

Esta alegação (infundada) diz que

ReiserFS has no trouble at all with hundreds of thousands of files in a single directory. flabdablet - February 1, 2007

Esta questão site da irmã stackoverflow.com poderia ajudar também.

Em geral:

  • Existe um limite para a quantidade de diretórios,
  • Você deve manter seus arquivos / diretórios abaixo de 32K, mas pode ir muito além,
  • O sistema de arquivos que você está usando é importante.
por 03.06.2009 / 22:41
1

Isso depende muito do sistema de arquivos que você usa. Certas versões mais antigas do ext3 foram atrozes com isso, que é como as btrees surgiram. O Reiser tem muito mais desempenho com um grande número de arquivos como esse. Antigamente, eu tinha um diretório NSS da Novell em um servidor NetWare com 250.000 arquivos de 4kb devido a um flush do GroupWise e funcionava muito bem. Enumerar o diretório era uma droga, mas acessar um arquivo específico naquele diretório funcionava tão rápido quanto você esperava. Como isso foi há 8 anos, devo presumir que os sistemas de arquivos modernos do Linux podem lidar com isso com calma.

    
por 03.06.2009 / 22:11
1

Depende do sistema de arquivos que você está usando, não do sistema operacional de 64 bits. Com cada sistema de arquivos, haverá um ponto em que os grandes custos do algoritmo usado para pesquisar o diretório vão tirar o melhor do computador.

Se você conseguir dividir a hierarquia de arquivos em apenas duas (2) hierarquias, verá uma melhor escalabilidade a longo prazo.

    
por 03.06.2009 / 22:12
1

Sistemas de arquivos no diretório de armazenamento do Linux basicamente de duas maneiras:

  1. Como uma lista simples de arquivos.

  2. Como uma estrutura de dados (geralmente uma árvore B + ou estrutura de dados relacionada).

O primeiro fica progressivamente mais lento conforme os arquivos são adicionados. Este último não. Note que ainda pode demorar uma eternidade, já que é necessário procurar os inodes de todos esses arquivos, as entradas do diretório contêm apenas o nome do arquivo e o número do inode.

Os diretórios Ext3 são listas simples, com uma opção para um índice de árvore com hash para acelerar as coisas.

O XFS usa árvores B +.

Mas para qualquer um desses sistemas de arquivos, se você fizer um ls -l, precisará pressionar quantos inodes houver arquivos. Para pesquisas de nomes (ao abrir um arquivo, por exemplo), B + Tree e coisas assim serão muito mais rápidas para diretórios grandes.

Uma hierarquia de diretórios facilita o gerenciamento dos arquivos e, portanto, você pode querer considerar essa possibilidade. Até mesmo uma única camada de diretórios com, digamos, 4000 arquivos limitam cada um, tornaria as coisas muito mais fáceis de gerenciar.

    
por 03.06.2009 / 22:21
1

Se você estiver indo além de algumas centenas de imagens, considere definitivamente duas coisas:

  1. Hierarquias aninhadas com nomes de arquivos com hash;
  2. Não usando ext3

Eu recomendaria o uso do XFS ou, na sua falta, do ReiserFS, com uma hierarquia de diretórios de duas ou três profundidades dividida em pares de dois bytes. por exemplo,

11/2f/112f667c786eac323e300632b5b2a78d.jpg
49/2f/49ef6eb6169cc57d95218c842d3dee5c.jpg
0a/26/0a26f9f363f1d05b94ceb14ff5f27284.jpg

Isso lhe dará 256 diretórios nos primeiros níveis, dividindo as imagens em um total de 65535 diretórios separados (o que é mais do que suficiente para imagens de 100 a 200k e além). Isso tornará as coisas muito mais rápidas e muito mais escaláveis, além de facilitar a manutenção mais tarde.

    
por 06.06.2009 / 00:36
0

A maioria das configurações padrão do ext3 tem um limite de subdiretórios de 32K por diretório (não é possível lembrar o número real agora, mas encontramos esse problema há algumas semanas atrás, o sistema era Debian / Etch naquele tempo).

Você também pode acertar você em alguns aplicativos que usam muito cache.

    
por 03.06.2009 / 22:19
0

Considere não usando ext3, certamente. link (mostra novos recursos no ext4) pode ser um ponto de partida útil.

Você diria como o squid organiza seu cache também (várias camadas de diretórios), já que muitos arquivos em um diretório podem ser difíceis de manter. Listas longas (geralmente) sugam.

    
por 03.06.2009 / 22:37
0

sistemas de arquivos ext3 possuem htrees para diretórios grandes por padrão na maioria das distros. faça um tune2fs -l /dev/sda1 (ou qualquer dispositivo de bloco que você esteja usando) e verifique a linha "Recursos do sistema de arquivos:". se houver um "dir_index" entre eles, você é de ouro.

observe, no entanto, que mesmo as melhores estruturas de diretórios só podem acelerar a localização de um arquivo específico. Fazer ls em um diretório enorme será terrível, assim como qualquer padrão correspondente, mesmo que você saiba que ele corresponde a um único arquivo.

por esses motivos, geralmente é melhor adicionar um ou dois níveis de diretórios. geralmente usando alguns bits de um ID para nomear os diretórios.

    
por 03.06.2009 / 22:41
0

Isso vai depender um pouco do sistema de arquivos que você está usando em seu servidor Linux.

Supondo que você esteja usando ext3 com dir_index, você deve ser capaz de pesquisar diretórios grandes com bastante rapidez, para que a velocidade não seja um grande problema. As listagens (obviamente) levarão mais tempo.

Quanto ao número máximo de arquivos que você pode colocar no diretório, tenho certeza que você pode trabalhar de forma confiável até 32.000 arquivos. Não tenho certeza se gostaria de exceder isso (mesmo que você provavelmente possa).

    
por 03.06.2009 / 22:59