Pergunta

projeto Meu PHP irá utilizar milhares de fotos e cada um precisa apenas de um único número para ele do nome de armazenamento.

A minha ideia inicial era colocar todas as imagens em um único diretório e nomear os arquivos "0.jpg", "1.jpg", "2.jpg", e todo o caminho para "4294967295.jpg".

seria melhor em termos de performance para criar uma estrutura de árvore de diretórios e nomear os arquivos algo como "429/496 / 7295.jpg"?

Se a resposta for sim, então o acompanhamento pergunta seria: o que é a quantidade ideal de subdirs ou arquivos por nível de profundidade? E qual o efeito que o escolhido sistema de arquivos tem sobre isso?

Cada arquivo terá uma entrada MySQL correspondente com um id-número UNSIGNED Inteiro longo.

Obrigado.

Foi útil?

Solução

Depende de qual sistema de arquivos está sendo usado. ext {2,3,4} tem uma opção dir_index que pode ser definida quando eles são criados que fazem armazenar milhares ou mesmo milhões de arquivos em um único diretório razoavelmente rápido.

Btrfs ainda não está pronto para produção, mas ele suporta implicitamente essa idéia em um nível muito básico.

Mas se você estiver usando a série ext sem dir_index ou a maioria dos outros sistemas de arquivos Unix você precisará ir para o esquema mais complexo de ter vários níveis de diretórios. Sugiro que você evitar que se você puder. Ele só adiciona um monte de complicação extra para algo sistemas de arquivos deve ser manipulação razoavelmente para você.

Se você não usar o esquema mais complexo, gostaria de sugerir codificar o número em hexadecimal e ter 256 arquivos / diretórios em cada nível. Sistemas de arquivos que não são projetados para lidar com um grande número de arquivos em cada diretório costuma fazer varreduras lineares. O objetivo é aproximar uma estrutura do tipo B-Tree em seu próprio país. 2 dígitos hexadecimais em cada nível dá-lhe cerca de meio 4kiB (um tamanho comum) bloco de disco por nível com meios comuns de codificação de diretórios. Isso é quase tão bom quanto você está indo para obter, sem um esquema realmente complicado como codificar os seus números na base de 23 ou base 24.

Outras dicas

Sim, difícil de dizer, um pouco, talvez você deve usar um banco de dados

A sabedoria convencional é "usar um banco de dados" , mas usando o sistema de arquivos é um plano razoável para objetos maiores, como imagens.

Alguns sistemas de arquivos têm limites sobre o número de entradas de diretório. Alguns sistemas de arquivos não têm qualquer tipo de estrutura de dados para pesquisas de nome de arquivo, mas apenas fazer uma varredura linear do diretório.

otimizações como você está discutindo são restritas aos perfis ambientais específicas. Você nem sabe agora o hardware futuro o aplicativo será executado? Poderia ser uma boa idéia para não enfatizar o sistema de arquivos e fazer um agradável, estrutura de diretórios hierárquica? Se você fizer isso ele vai rodar bem em qualquer servidor de arquivos ou armazenamento.

Tendo vários arquivos de milhares em um diretório irá retardar as coisas consideravelmente. Eu diria que um número seguro é até 1024 arquivos por diretório, 512 ainda melhor.

A resposta, claro, é:. Depende

Em particular, depende de qual sistema de arquivos que você usa. Por exemplo, o ext2 e ext3 sistemas de arquivo tem um limite para o número de arquivos por diretório. Esses sistemas de arquivos não seria capaz de colocar todas as suas fotos em um diretório!

Você pode olhar para algo que não seja um sistema de arquivos. Na empresa em que trabalho, porque precisávamos para armazenar grande quantidade de material, mudamos de armazenamento baseado em arquivo para uma corrida de armazenamento baseado em banco de dados em Apache Jackrabbit .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top