Desvantagem em ter (potencialmente) milhares de diretórios em um servidor em vez de um banco de dados?

StackOverflow https://stackoverflow.com/questions/1220965

Pergunta

Eu estou tentando começar a usar arquivos de texto simples para armazenar dados em um servidor, em vez de armazená-los todos em um grande banco de dados MySQL. O problema é que eu provavelmente seria gerando milhares de pastas e centenas de milhares de arquivos (se eu tiver a escala). Quais são os problemas com fazendo isso? Faz ficar muito lento? É sobre o mesmo desempenho como a utilização de um banco de dados?

O que quero dizer: Em vez de ter um banco de dados que armazena uma tabela blog, em seguida, tem uma linha que contém "mensagem" e "data" Eu, ao invés, têm "autor": Uma pasta para o cargo específico, então * .txt dentro dessa pasta que tem "autor", "mensagem" e "data" armazenados neles.

Foi útil?

Solução

Este seria imensamente mais lento do que a leitura de um banco de dados (arquivo escreve tudo acontecer mais ou menos na mesma velocidade - você não pode armazenar uma gravação na memória).

Os bancos de dados são otimizados e destina-se a lidar com esses grandes quantidades de estruturados de dados. Os sistemas de arquivos não são. Seria um erro tentar replicar um banco de dados com um sistema de arquivos. Afinal, você pode indexar suas colunas de banco de dados, mas é difícil para indexar o sistema de arquivos sem outra ferramenta.

Os bancos de dados são construídos para rápido acesso aos dados e recuperação. Os sistemas de arquivos são construídos para armazenamento de dados. Use a ferramenta certa para o trabalho. Neste caso, é absolutamente um banco de dados.

Dito isto, se você deseja criar arquivos HTML para as mensagens e, em seguida, armazenar essas localidades em um DB para que você possa facilmente chegar a eles, então isso é definitivamente uma boa solução (a la Movable Type).

Mas se você armazenar essas coisas em um sistema de arquivos, como você pode descobrir o seu último post? Mais prolífico autor? A maioria autor controverso? Todas essas coisas são triviais com um banco de dados, e muito difícil com um sistema de arquivos. Vara com o banco de dados, você será feliz que você fez.

Outras dicas

É realmente depende:

  • O que é o tamanho do arquivo
  • Quais são os requisitos de durabilidade que você tem?
  • Como muitas atualizações que você realizar?
  • O que é sistema de arquivos?

Não é óbvio que o MySQL seria mais rápido:

Eu fiz uma vez tal comparação para pequena objeto, a fim de usá-lo como armazenamento de sessões para CppCMS . Com um índice (Key Only) e dois índices (chave primária e tempo limite secundário).

File System:   XFS     ext3 
-----------------------------
Writes/s:      322     20,000

Data Base \  Indexes:    Key Only   Key+Timeout
-----------------------------------------------
Berkeley DB              34,400      1,450
Sqlite No Sync            4,600      3,400
Sqlite Delayed Commit    20,800     11,700

Como você pode ver, com o sistema de arquivos simples Ext3 foi mais rápido ou tão rápido quanto Sqlite3 para armazenamento de dados, pois não lhe dá (D) de ácido.

Por outro lado ... DB dá-lhe muitas, muitas características importantes que você provavelmente precisa, de modo Eu não recomendaria o uso de arquivos de armazenamento a menos que você realmente precisa dele.

Lembre-se, DB é nem sempre o gargalo do sistema

Esqueça respostas sobre prolixo, aqui estão as razões mais simples porque armazenar dados em arquivos de texto simples é uma má idéia:

  1. É quase impossível para consulta. Como você ordenação Blog mensagens de data? Você teria que ler todos os arquivos e comparar a sua data, ou manter seu próprio arquivo de índice (basicamente, escrever o seu próprio sistema de banco de dados.)

  2. É um pesadelo para backup. tar cjf não vai cortá-la, e se você tentar, você pode acabar com um instantâneo inconsistente.

Há provavelmente uma dúzia de outras boas razões para não arquivos de uso, é difícil monitorar o desempenho, muito difícil de debug, quase impossível de recuperar em caso de erro, não há ferramentas para lidar com eles, etc ...

Eu acho que a chave aqui é que haverá NO indexação em seus dados. SO para recuperar qualquer coisa em dizer uma pesquisa seria ridiculamente lento em comparação com um banco de dados indexados. Além disso, operações de IO são caros, um banco de dados poderia ser (parcialmente) na memória, que disponibiliza os dados muito mais rápido.

Você realmente não dizer por que você não vai usar um banco de dados a si mesmo ... Mas, no cenário que você está descrevendo Eu definitivamente usar um DB sobre pasta qualquer dia, para um par de razões. Primeiro de tudo, o cenário do blog parece muito simples, mas é muito fácil imaginar que, algum dia, gostaria de expandi-lo com mais funcionalidades como pesquisa, detalhes mais post, categorias etc.

Eu acho que crescer o modelo seria mais difícil de fazer em uma estrutura de pastas do que em um DB.

Além disso, os bancos de dados são geralmente muito mais rápido do que o acesso ao arquivo devido à indexação e memória cache.

IIRC FUDforum usado o arquivo de armazenamento de por razões de velocidade, ele pode ser muito mais rápido para pegar um arquivo do que para procurar um índice DB, recuperar os dados do banco de dados e enviá-lo para o usuário. Você está trocando a interface de sistema de arquivos com as interfaces de banco de dados e DB-biblioteca.

No entanto, isso não significa que ele vai ser mais rápido ou mais lento. Eu acho que você vai encontrar a escrita é mais rápido no sistema de arquivos, mas a leitura mais rápido no DB para questões gerais. Se, como FUDforum, você tem dados relativamente imutáveis ??que você quer mostrar várias mensagens em um, então uma abordagem file-basd pode ser muito mais rápido: por exemplo, eles não tem que procurar cada post relacionado, furam tudo em arquivo 1 texto e exibi-lo uma vez. Se você pode empregar esse tipo de otimização, então a sua abordagem baseada em arquivo irá funcionar.

Além disso, servidores de correio trabalhar na abordagem baseada em arquivo também, o formato de lojas Maildir cada mensagem de e-mail como um arquivo em um diretório, não em um banco de dados.

Uma coisa gostaria de dizer, porém, você vai ser melhor armazenar tudo em um arquivo, e não 3. O sistema de arquivos é melhor em leitura (e cache) um único arquivo que está com vários. Então, se você deseja armazenar cada mensagem como 3 partes, senão todos eles em um único arquivo, lê-lo para obter qualquer das partes e apenas exibir aquela que deseja mostrar.

... e então você deseja pesquisar todas as mensagens de um autor e você começa a ler um milhão de arquivos em vez de uma simples consulta SQL ...

bancos de dados não são mais rápidos. Pense nisso: No final, eles armazenar os dados no sistema de arquivos também. Portanto, a questão se um banco de dados é mais rápido depende fortemente do caminho de acesso.

Se você tem apenas um caminho de acesso, que se correlaciona com a sua estrutura de arquivos do sistema de arquivos pode ser a maneira mais rápida, em seguida, um banco de dados. Apenas certifique-se de ter alguns cache disponível para o sistema de arquivos.

Claro que sim solta todas as coisas boas de um banco de dados: - operações - formas flexíveis para dados de índice e dados, portanto, de acesso, de uma forma flexível razoavelmente rápido. - flexível (embora feio) linguagem de consulta -. Alta capacidade de recuperação

A escala realmente depende do sistema de arquivos usado. AFAIK sistema mais arquivo de ter algum tipo de limite superior para o número de arquivos (total ou por diretório), embora nos novos esta é muitas vezes muito alto. Para centenas de milhares de arquivos com uma estrutura de diretório para manter os diretórios para um tamanho razoável, deve ser possível encontrar um sistema de arquivos com bom desempenho.

@ comentário de Eric: Depende do que você precisa. Se você só precisa o conteúdo exato em arquivo por consulta, e você pode determinar o local eo nome do arquivo de uma forma determinista o acesso directo é mais rápido do que o que um banco de dados faz, que é aproximadamente:

  • o acesso de um bando de entradas de índice, a fim de
  • o acesso de um grupo de linhas da tabela (RDBMS tipicamente ler blocos que contêm várias linhas), a fim de
  • escolher uma única linha do bloco.

Se você olhar para ele:? Você tem índices e linhas adicionais na memória, que tornam a sua cache ineficiente, onde está o a aceleração de um db supostamente oriundas

Os bancos de dados são grandes para o caso geral. Mas se você tem um caso especial, há quase sempre uma solução especial que é melhor em algum sentido.

Se você está preferiu ir embora com RDBMS, por que não u tente o outro valor fundamental open source ou documento DBs (Não-relacional DBS) ..

De ur postagem eu entendo que não ur indo para seguir todas as propriedades ACID de banco de dados relacional .. seria melhor se adaptar outros dbs valor chave (MongoDB, coutchdb ou hyphertable) em vez de sua própria implementação do sistema de arquivos .. ele vai dar um melhor desempenho do que as abordagens existentes ..

Nota: Não sou também especialista nesta .. só começou a trabalhar no MongoDB e achar útil em cenários semelhantes. Só queria compartilhar no caso u r não ciente destas abordagens

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