Qual é a melhor maneira de armazenar milhares de imagens em uma estrutura de pastas do Windows?

4

Temos centenas de milhares de imagens jpg em uma estrutura de pastas do Windows como essa, mas é muito difícil interagir e trabalhar com elas de uma forma rápida (a listagem leva tempo, a cópia leva tempo, etc.). Aqui está a estrutura:

images/
  1/
    10001/
      10001-a.jpg
      10001-b.jpg
      ...
      10001-j.jpg (10 images in each XXXXX folder)
    10002/
    10003/
    ...
    19999/
  2/
    20001/
    20002/
    20003/
    ...
    29999/
  3/
  4/
  5/
  6/
  7/
  8/
  9/

Agora, navegar nessas imagens é um pouco lento porque há aprox. 10 000 pastas em cada pasta X e listar essas simplesmente leva tempo.

Existe uma maneira melhor de organizar as imagens com menos subpastas / itens? Mudar a estrutura para isso tem algum efeito?

images/
  1/
    0/
      0/
        0/
          0/
          1/
          2/
          3/
          4/
          5/
          6/
          7/
          8/
          9/
          10000/ (image folder, same as path)
            10000-a.jpg
            10000-b.jpg
            ...
            10000-j.jpg (10 images in each image folder)
        1/
        2/
        3/
        4/
        5/
        6/
        7/
        8/
        9/
      1/
      2/
      3/
      4/
      5/
      6/
      7/
      8/
      9/
    1/
    2/
    3/
    4/
    5/
    6/
    7/
    8/
    9/
  2/
  3/
  4/
  5/
  6/
  7/
  8/
  9/

Assim, a localização da imagem 48617-c.jpg seria igual ao caminho 4/8/6/1/7/48617/48617-c.jpg.

O motivo para ter uma pasta separada com o número de caminho completo 48617 é simplificar a cópia de um lote de 10 imagens completo (copiando a pasta inteira).

Agora ... nenhuma pasta terá mais de 11 subpastas imediatas, mas haverá muitas pastas extras de dígito único para fins de separação. Essa configuração aceleraria a navegação e a interação com vários usuários adicionando / copiando / excluindo / etc.?

    
por user1603240 23.08.2012 / 21:41

3 respostas

5

O Windows é um pouco especial quando se trata de layout de pastas com kajillions de arquivos. Especialmente imagens, desde que o Windows Explorer as trata especiais. Dito isso, há algumas diretrizes a serem seguidas para impedir que as coisas fiquem muito fora de mão:

  • Se você pretende navegar na estrutura de diretório do Windows Explorer por qualquer motivo, mantenha-a abaixo de 10.000 entradas em um diretório (arquivos e subdiretórios).
  • Se você estiver interagindo apenas com utilitários cli ou codificar, o limite de 10K será muito mais flexível.
  • Não crie muitos subdiretórios, cada diretório criado é outra operação discreta que uma cópia precisa fazer ao copiar.
    • Se cada arquivo criar diretórios N, o número de objetos de sistema de arquivos criados por esse arquivo será 1 + N, o que dimensionará linearmente seus tempos de cópia.
    • Uma árvore curta e exponencial (ou seja, três camadas de diretórios, cada uma com 256 subdiretórios) pode ser incrivelmente rápida antes de você entrar no limite de 10K / por diretório.
  • Se você estiver acessando-o com código, vá para aberturas diretas em vez de analisar as listagens de diretórios antes de abrir. Um fopen () com falha, seguido por uma varredura de diretório, é mais rápido do que uma varredura dir seguida por uma fopen () garantida em muitos casos.

Advertências:

  • A contagem de arquivos é imutável, mas a contagem de diretórios depende de você. A soma dessas duas contagens afeta a rapidez com que as operações de cópia ocorrem.
  • Tente, se possível, não navegar no Windows Explorer, a menos que seja necessário. Não lida bem com diretórios grandes e não há muito o que fazer sobre isso.
por 23.08.2012 / 23:47
2

Há muitas informações boas sobre a matemática na minha resposta de Como a complexidade do diretório influencia os i-nodes?

Com isso dito, diferentes sistemas de arquivos lidam com um grande número de arquivos em diretórios de várias maneiras. Alguns estão bem com 10.000 entradas, outros fivela. Como uma regra prática inventada rapidamente, 1.000 é provavelmente um bom limite de destino se você tiver controle de design. Entradas em um diretório geralmente são armazenadas como um tipo de lista e cabe ao aplicativo de leitura ordenar seu pedido. Por exemplo, ls no mundo Unix lê coisas na memória a partir da ordem dos diretórios e as imprime em ordem alfabética.

Dê uma olhada na matemática da outra pergunta. Considere também o que o sysadmin1338 disse sobre o comportamento do Explorer de maneira diferente. O Explorer criará miniaturas de qualquer coisa que reconheça como uma imagem e depois lerá as miniaturas para exibi-las. Isso é muito disco IO para olhar para um diretório que está repleto de arquivos.

    
por 24.08.2012 / 01:43
1

Dependendo se você tem os recursos para desenvolver um sistema desse tipo, isso soa como um bom candidato para um banco de dados do SQL Server usando FILESTREAM armazenamento para os arquivos. Dessa forma, você deixa a organização dos diretórios para o SQL Server e tudo o que precisa se preocupar é como gerenciar os dados em si. Você provavelmente poderia usar o SQL Express, já que os dados do FILESTREAM não são levados em conta ao calcular o tamanho do banco de dados.

    
por 24.08.2012 / 01:31