Melhor estrutura de arquivos para armazenar milhares de fotos (em tamanhos diferentes)

3

Estou desenvolvendo um site que permite que as pessoas façam upload de imagens. Nós redimensionamos cada imagem para 4 tamanhos. Estamos esperando muitas e muitas imagens e estamos pensando em maneiras de aumentar o desempenho em relação à estrutura de arquivos, pois não queremos realmente um diretório com 10000s de arquivos. Alguém tem alguma sugestão sobre como organizamos os arquivos?

As opções que parecem óbvias são

cada usuário tem sua própria pasta e, dentro dela, uma pasta para cada tamanho

(cada uma das quatro pastas pode conter muitas imagens)

/user_uploads/user01/
                 |-/size_thumb/
                 |-/size_small/
                 |-/size_medium/
                 |-/size_large/
/user_uploads/user02/
                 |-/size_thumb/
                 |-/size_small/
                 |-/size_medium/
                 |-/size_large/

   etc etc

ou cada usuário armazena fotos armazenadas em uma pasta por usuário (mais fotos por diretório, mas menos diretórios gerais)

/user_uploads/user01/
/user_uploads/user02/
  etc etc

cada foto armazenada por tamanho

muitas e muitas fotos por diretório (poderia ter mais subpastas por data?)

/user_uploads/small/
/user_uploads/medium/
/user_uploads/large/
/user_uploads/thumbs/

Alguém tem alguma ideia? Acho que provavelmente iremos com /user_uploads/userID/ , a menos que alguém tenha alguma sugestão.

(Agora tudo estará hospedado em um computador, então não precisamos nos preocupar com arquivos em servidores diferentes)

    
por st0rage 21.07.2010 / 01:01

1 resposta

4

Você pode querer testar o md5 da imagem enquanto ela é enviada e armazená-la em uma estrutura de diretórios como esta abaixo. Assumindo 3 imagens que hash para:

  1. 2b00042f7481c7b056c4b410d28f33cf
  2. 84bdbf7c4d48e16642af4c317df428c2
  3. 7b2a7edc6e86224d6ba0f97b717c80ed

E uma estrutura de pastas com esta aparência:

/images/orig/2/2b/2b0/2b00042f7481c7b056c4b410d28f33cf.jpg
/images/orig/8/84/84b/84bdbf7c4d48e16642af4c317df428c2.jpg
/images/orig/7/7b/7b2/7b2a7edc6e86224d6ba0f97b717c80ed.jpg

/images/large/2/2b/2b0/2b00042f7481c7b056c4b410d28f33cf.jpg
/images/large/8/84/84b/84bdbf7c4d48e16642af4c317df428c2.jpg
/images/large/7/7b/7b2/7b2a7edc6e86224d6ba0f97b717c80ed.jpg

/images/small/2/2b/2b0/2b00042f7481c7b056c4b410d28f33cf.jpg
/images/small/8/84/84b/84bdbf7c4d48e16642af4c317df428c2.jpg
/images/small/7/7b/7b2/7b2a7edc6e86224d6ba0f97b717c80ed.jpg

Você pode fazer tantos níveis seguindo o padrão acima quanto desejar manter os tamanhos de diretório gerenciáveis. Além disso, se preferir, você pode usar algum ID de usuário para identificar as imagens e ainda usar uma estrutura semelhante, por exemplo. assumindo o id do usuário de 14: (/images/orig/0/00/0014/0014.jpg)

Você pode armazenar o usuário - > dados hash de imagem em seu banco de dados, mantendo suas imagens no sistema de arquivos. Independentemente do fato de que pode ser possível armazenar imagens dentro de um banco de dados, há razões pelas quais você pode não querer fazê-lo. Mantê-los no sistema de arquivos torna-os muito mais fáceis de mover, digamos para um CDN ou para a nuvem à medida que você cresce. Ele também permite que você coloque diretórios em discos diferentes para aumentar o desempenho de leitura, se é isso que você gosta.

O fato de você transformar a imagem original em md5 significa que, se 30 pessoas enviarem a mesma imagem, você manterá apenas uma cópia (em todos os tamanhos) dessa imagem em seu sistema de arquivos, em vez de 30 cópias.

    
por 09.08.2010 / 22:52