Alguma limitação por ter muitos arquivos em um diretório no Mac OS X?

9

Tenho mais de 100.000 arquivos em um diretório no meu MacOS X e parece que é lento para o meu script ler um arquivo neles.

Existe alguma limitação ou recomendação para ter tantos arquivos? Devo dividi-los em alguns diretórios?

A limitação que encontrei foi que não posso mv * foopara todos os 100.000 arquivos. Ele mostra um erro, dizendo "argumento muito longo". Funciona com aproximadamente menos de 20.000 arquivos.

Daisuki Honey
fonte
Atualmente, tenho 380.000 arquivos em um diretório e percebo que mesmo abrir um arquivo leva apenas mais de 10 segundos. Eu decidi separá-los em alguns diretórios.
Daisuki Honey 28/11
11
O sistema de arquivos HFS + deve poder armazenar e acessar um grande número de arquivos em um diretório por seu nome completo, sem muitos problemas. Mas você precisa tomar cuidado com caracteres curinga. Quando você usa *ou ?como parte de um argumento para um comando, o sistema operacional pesquisa no diretório inteiro por arquivos correspondentes (lento) e, em seguida, substitui o argumento por uma lista de todos os arquivos correspondentes (longos), que são transmitidos para o diretório comando. Você pode fazer melhor com um loop ou com vários comandos mv, por exemplo mv a* foo && mv b* foo,.
Matthias Fripp

Respostas:

1

De acordo com esta resposta do Stack Overflow e detalhes específicos no site da Apple , uma pasta individual pode conter até 2,1 bilhões de itens.

Dito isto, apenas porque ele pode armazenar até 2,1 bilhões de itens não significa que ele possa manter o desempenho nesse nível. De acordo com a Wikipedia ; ênfase é minha:

O arquivo de catálogo, que armazena todos os registros de arquivos e diretórios em uma única estrutura de dados, resulta em problemas de desempenho quando o sistema permite multitarefa, pois apenas um programa pode gravar nessa estrutura por vez, o que significa que muitos programas podem estar aguardando na fila devido a um programa "monopolizando" o sistema. Também é uma preocupação séria de confiabilidade, pois os danos nesse arquivo podem destruir todo o sistema de arquivos.

Portanto, o desempenho é degradado naturalmente, porque o arquivo de catálogo pode ser usado apenas por um programa por vez. E se o diretório aumentar de tamanho, o risco / degradação causado por esse problema aumentará apenas; mais arquivos significa uma chance maior de os programas acessarem arquivos nesse diretório. Confirmação adicional dessa ideia aqui ; novamente a ênfase é minha:

O arquivo de catálogo é uma estrutura complicada. Como mantém todas as informações de arquivos e diretórios, força a serialização do sistema de arquivos - não é uma situação ideal quando há um grande número de encadeamentos que desejam executar a E / S de arquivos. No HFS, qualquer operação que cria ou modifica um arquivo de qualquer forma precisa bloquear o arquivo de catálogo, o que impede que outros threads acessem apenas o arquivo de catálogo. O acesso ao arquivo de catálogo deve ser de um único gravador / multi-leitor.

JakeGould
fonte
Muito obrigado. Entendo que o acesso ao arquivo de catálogo será um gargalo e pode causar sérios problemas de desempenho, especialmente para multitarefa.
precisa
@DaisukiHoney De nada! Portanto, se você achou minha resposta útil, lembre-se de votar. E se foi a resposta que resolveu o seu problema, lembre-se de marcar como tal.
JakeGould
Sim, definitivamente estou votando sua resposta e marque-a. Mais uma vez, muito obrigado.
quer
As seções da Wikipedia que você menciona estão falando sobre limites de escalabilidade por sistema de arquivos, não por diretório: existe apenas um arquivo de catálogo por sistema de arquivos e todo acesso deve ser serializado. É bastante irrelevante para a questão.
poolie
@poolie A pergunta é sobre por diretório existente em um sistema de arquivos. O arquivo de catálogo existe por sistema de arquivos, mas o diretório em si também existe no mesmo sistema de arquivos. É relevante para uma pergunta que lide com mais de 10.000 arquivos em um diretório existente em um único sistema de arquivos. Mas essa pergunta tem mais de 2 anos, então obrigado pelo link do Wiki. Atualizei minha resposta para incluir a nova redação, bem como um link direto para a seção em questão.
JakeGould
4

Resposta curta: Bem, se você estiver lendo 100.000 arquivos, posso esperar que o script seja lento.

Resposta longa: Para responder a essa pergunta mais detalhadamente, é necessário examinar o sistema de arquivos em um Mac. Os Macs usam o HFS + ( Hierarchical File System Plus ), que é um sistema de arquivos moderno que possui limitações, mas apenas em situações extremas.

Pela minha experiência, é muito parecido com um sistema de arquivos de registro em diário do Linux EXT. Ele suporta diretórios de montagem, permissões do tipo UNIX, etc. Ele endereçou arquivos em um formato de 32 bits, criando o número máximo de arquivos que podem ser armazenados em um volume 4.294.967.295, de acordo com esta fonte.

O sistema de arquivos começa a quebrar com arquivos maiores que 8 EB nos sistemas modernos e até 2,1 bilhões de arquivos e pastas em um local, conforme descrito aqui .

Dada a maneira como o HFS + - ou realmente qualquer sistema de arquivos é configurado -, ter muitos arquivos em uma pasta não deve fazer nada de 'estranho'.

Honestamente, acho que não haveria uma melhoria no desempenho distribuindo os arquivos por uma hierarquia de pastas mais complexa. Na verdade, essa técnica pode ser menos eficiente porque seu script precisaria fazer chamadas para alterar diretórios no meio do processo.

James Taylor
fonte
Direita. Pensei em mudar a hierarquia de diretórios, mas isso causa um algoritmo mais complicado e suspeito que haja muita melhoria no desempenho. Obrigado pela resposta. Atualmente, tenho 200.000 arquivos no diretório e pode ter 1.000.000 no final. Espero que funcione bem sem esse desempenho ruim.
precisa
@DaisukiHoney Se você estiver trabalhando com tantos arquivos, pode valer a pena ver se é possível subdividir as coisas em diretórios. Pode ser difícil de fazer nesta fase, mas pode tornar as coisas um pouco mais estáveis ​​no futuro.
JakeGould
@JakeGould Obrigado pelo conselho. Eu estive pensando em reestruturar, porque posso adicionar mais alguns arquivos. Obrigado.
Daisuki Mel