Colocando muitos (10 milhões) arquivos em uma pasta

17

Acabei de adicionar um recurso de pesquisa preditiva (veja o exemplo abaixo) ao meu site que roda em um servidor Ubuntu. Isso é executado diretamente de um banco de dados. Quero armazenar em cache o resultado de cada pesquisa e usá-lo, se existir, senão criá-lo.

Haveria algum problema comigo ao salvar os potenciais milhões de resultados de cira 10 milhões em arquivos separados em um diretório? Ou é aconselhável dividi-los em pastas?

Exemplo:

Kohjah Breese
fonte
5
Seria melhor dividir. Qualquer comando que tente listar o conteúdo desse diretório provavelmente decidirá se disparar.
muru
8
Então, se você já possui um banco de dados, por que não usá-lo? Eu tenho certeza que o DBMS será mais capaz de lidar com milhões de registros vs. o sistema de arquivos. Se você está decidido a usar o sistema de arquivos, precisa criar um esquema de divisão usando algum tipo de hash, neste ponto, IMHO, parece que usar o banco de dados será menos trabalhoso.
roadmr
3
Outra opção para armazenamento em cache que melhor se adapta ao seu modelo pode ser o memcached ou o redis. Eles são armazenamentos de valores-chave (portanto, agem como um único diretório e você acessa itens apenas pelo nome). O Redis é persistente (não perderá dados quando for reiniciado), enquanto o memcached é para itens mais temporários.
Stephen Ostermiller
2
Há um problema de galinha e ovo aqui. Os desenvolvedores de ferramentas não lidam com diretórios com um grande número de arquivos porque as pessoas não fazem isso. E as pessoas não criam diretórios com um grande número de arquivos porque as ferramentas não o suportam bem. Por exemplo, eu entendi ao mesmo tempo (e acredito que isso ainda é verdade), uma solicitação de recurso para criar uma versão de gerador os.listdirem python foi negada categoricamente por esse motivo.
Pela minha própria experiência, vi falhas ao passar por arquivos de 32k em um único diretório no Linux 2.6. É possível ajustar além desse ponto, é claro, mas eu não o recomendaria. Basta dividir em algumas camadas de subdiretórios e será muito melhor. Pessoalmente, eu o limitaria a cerca de 10.000 por diretório, o que lhe daria 2 camadas.
Wolph 12/02

Respostas:

25

Haveria algum problema comigo salvando o potencial em torno de 10 milhões de resultados em arquivos separados em um diretório?

Sim. Provavelmente existem mais razões, mas posso postar em cima da minha cabeça:

  • tune2fspossui uma opção chamada dir_indexque tende a ser ativada por padrão (no Ubuntu), que permite armazenar aproximadamente 100k arquivos em um diretório antes de ocorrer um desempenho. Isso não chega nem perto dos 10 milhões de arquivos que você está pensando.

  • extOs sistemas de arquivos têm um número máximo fixo de inodes. Cada arquivo e diretório usa 1 inode. Use df -ipara visualizar suas partições e inodes gratuitamente. Quando você fica sem inodes, não pode criar novos arquivos ou pastas.

  • comandos como rme lsao usar curingas expandem o comando e terminam com uma "lista de argumentos muito longa". Você precisará usar findpara excluir ou listar arquivos. E findtende a ser lento.

Ou é aconselhável dividi-los em pastas?

Sim. Definitivamente. Basicamente, você não pode armazenar arquivos de 10m em um diretório.

Eu usaria o banco de dados. Se você deseja armazená-lo em cache em um site, consulte " solr " ("fornecendo indexação distribuída, replicação e consulta com balanceamento de carga").

Rinzwind
fonte
8

Acabou com o mesmo problema. Execute meus próprios benchmarks para descobrir se você pode colocar tudo na mesma pasta versus ter várias pastas. Parece que você pode e é mais rápido!

Referência

Ref: https://medium.com/@hartator/benchmark-deep-directory-structure-vs-flat-directory-structure-to-store-millions-of-files-on-ext4-cac1000ca28

Hartator
fonte
1
Obrigado, isso é muito útil. Estou usando isso em um site e tem sido um problema real reprogramar esta parte para ter estruturas de diretório /abc/efg.html. Então, voltarei a um diretório simples no futuro.
Kohjah Breese
0

Uma pesquisa binária pode lidar facilmente com milhões de registros, portanto, pesquisar no diretório único não seria um problema. Isso será feito muito rápido.

Basicamente, se você estiver usando um sistema de 32 bits, a pesquisa binária de registros de até 2 GB é fácil e boa.

O Berekely DB, um software de código aberto, prontamente permite que você armazene o resultado completo em uma entrada e teria a pesquisa incorporada.

Ashok Chand Mathur
fonte