Qual é a técnica de indexação de dados mais eficiente


10

Como todos sabemos, existem algumas técnicas de indexação de dados, usadas por aplicativos de indexação conhecidos, como Lucene (para java) ou Lucene.NET (para .NET), MurMurHash, B + Tree etc. Para um No-Sql / Object Banco de dados orientado (que eu tento escrever / brincar um pouco com C #), qual técnica você sugere?

Eu li sobre o MurMurhash-2 e, especialmente, os comentários da v3 dizem que o Murmur é muito rápido. O Lucene.Net também tem bons comentários. Mas e as pegadas de memória em geral? Existe alguma solução eficiente que use menos área ocupada (e, é claro, se for mais rápido) do que Lucene ou Murmur? Ou devo escrever uma estrutura de índice especial para obter os melhores resultados?

Se eu tentar escrever o meu próprio, existe alguma escala aceita para uma boa indexação, algo como 1% do nó de dados ou 5% do nó de dados? Qualquer dica útil será apreciada.

Respostas:


10

Eu acho que você estragou algumas coisas na sua pergunta. O Lucene (não sei nada sobre o Lucene, NET, mas suponho que seja o mesmo) é uma biblioteca usada para analisar, dividir em tokens e armazenar documentos para poder consultá-los e recuperá-los mais tarde. O Lucene tem um modelo bastante antigo, mas eficaz, que usa árvores invertidas para encontrar e recuperar documentos. Sem mais detalhes, todos os documentos são divididos em tokens (termos) e, para cada termo, é mantida uma estrutura de dados, que armazena todos os documentos que contêm o termo especificado. Como uma estrutura de dados pode ser usada, o BTree, uma tabela de hash e, nas principais revisões mais recentes, você pode até conectar suas próprias estruturas de dados.

Um BTree (consulte a página da Wikipedia para obter mais detalhes), é um tipo de estrutura de dados em árvore, apropriado para trabalhar com grandes blocos de dados e geralmente é usado para armazenar estruturas ordenadas em forma de árvore no disco. Na memória, outras árvores têm melhor desempenho.

Murmur hash (consulte a página da Wikipedia para obter mais detalhes), é uma família de funções de hash usadas na tabela de hash. A implementação da tabela de hash não é importante, pode ser uma implementação em cadeia padrão ou um esquema de endereçamento de hash aberto mais avançado. A idéia é que as tabelas de hash permitem obter uma chave rapidamente, a partir de um conjunto não ordenado de chaves, e podem responder a tarefas como: essa chave faz parte desse conjunto de chaves? qual é o valor associado a essa chave?

Agora, de volta ao seu principal problema. Você tem uma biblioteca (Lucene) e, para estruturas de dados, ambas as estruturas de dados são usadas no Lucene. Agora você vê que não é possível responder sua pergunta nesses termos, pois eles não são comparáveis.

No entanto, em relação à sua pegada e desempenho, parte da questão. Antes de tudo, você precisa saber que tipo de operações você precisa implementar.

Você só precisa obter valor para a chave ou precisa encontrar todos os elementos em um intervalo? Em outras palavras, você precisa de ordem ou não? Se você fizer isso, uma árvore pode ajudar. Caso contrário, uma tabela de hash, que é mais rápida, pode ser usada.

Você tem muitos dados que não cabem na memória? Se sim, uma solução baseada em disco ajudaria (como o BTree). Se seus dados cabem na memória, use a solução mais rápida na memória e use o disco apenas como armazenamento (com uma estrutura diferente, muito mais simples).


Muito obrigado Rapaio :) Os pontos que você me deu são muito úteis e ficam mais claros ... Como sou desenvolvedor .NET e curioso em C simples (começo a aprender) e em um novo, rápido, confiável e escalável ancd é claro que é totalmente controlável - em um curto prazo: técnicas muito empolgadas ... Então, preciso aprender muito ... Para aprender, tento ler tantos documentos, mas como você pode imaginar, estou na linha de partida. Eu não sabia que BTree tem vantagens no disco (In .Net mundo, tantos escritores explicar como: Uma estrutura de dados hierárquica como Linked-List..No mais!) muito obrigado novamente
sihirbazzz

E se você me permitir, até que haja uma qualidade explicação / resposta maior do que a sua, eu quero aceitar isso como resposta .. E BTW, Lucene.NET é uma implementação .NET de Lucene Java
sihirbazzz
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.