Domanda

Come tutti sappiamo, ci sono alcune tecniche di indicizzazione dei dati, utilizzando per le applicazioni di indicizzazione ben noti, come Lucene (per Java) o Lucene.NET (per NET), MurMurHash, B + Albero ecc Per un No- Sql / Object Oriented Database (che cerco di scrivere / giocare un po 'in giro con C #), quale tecnica suggerisce?

Ho letto di MurMurhash-2 e specialmente v3 commenti dire Murmur è molto veloce. Anche Lucene.Net ha buoni commenti su di esso. Ma per quanto riguarda la loro memoria impronte in generale? C'è qualche soluzione efficiente che utilizza meno ingombro (e naturalmente se più veloce è preferibile) che Lucene o Murmur? O dovrei scrivere una struttura di indice speciale per ottenere i migliori risultati?

Se provo a scrivere la mia, allora c'è qualche scala accettato per una buona indicizzazione, qualcosa come l'1% dei dati di nodo, o il 5% dei dati nodi? Qualsiasi suggerimento utile sarà apprezzato.

È stato utile?

Soluzione

Penso che si incasinato alcune cose nella sua interrogazione. Lucene (Non so niente di Lucene, NET, ma suppongo che è lo stesso) è una libreria usata per analizzare, diviso in gettoni, e archiviare documenti in modo da essere in grado di interrogare e recuperarli in seguito. Lucene ha un piuttosto vecchio ma efficace modello, utilizza invertito alberi per trovare e recuperare i documenti. Senza ulteriori dettagli, tutti i documenti sono divisi nel gettoni (termini), e per ogni termine viene mantenuta una struttura di dati che memorizza tutti i documenti che contiene il dato termine. Come una struttura di dati potrebbe essere utilizzato un BTree, una tabella hash e le ultime revisioni importanti si può anche collegare le proprie strutture di dati.

A BTree (vedi href="http://en.wikipedia.org/wiki/B-tree"> Wikipedia per ulteriori dettagli), è una sorta di una struttura dati ad albero, che è appropriato per lavorare con grandi blocchi di dati ed è spesso usato per memorizzare ad albero strutture ordinate sul disco. Per in-memory altri alberi esegue meglio.

Murmur hash (vedi href="http://en.wikipedia.org/wiki/MurmurHash"> Wikipedia per ulteriori dettagli), è una famiglia di funzioni hash utilizzate nella tabella hash. L'attuazione della tabella di hash non è importante, potrebbe essere un'implementazione incatenato standard o più avanzato schema di indirizzamento aperto hash. L'idea è che le tabelle hash permette di ottenere velocemente un tasto, da un insieme non ordinato di chiavi, e possono rispondere a compiti come: è questa parte fondamentale di questo set di chiavi? che è il valore associato a questa chiave?

Ora di nuovo al vostro problema principale. Hai una libreria (Lucene) e alle strutture di dati, entrambe le strutture di dati sono utilizzate in Lucene. Ora si vede che non è possibile rispondere alla tua domanda in questi termini dal momento che non sono comparabili.

Tuttavia, per quanto riguarda voi impronta e una parte delle prestazioni della questione. Prima di tutto dovete sapere che tipo di operazioni è necessario implementare.

avete bisogno solo ottenere il valore per la chiave, o hai bisogno di trovare tutti gli elementi in una serie? In altre parole, avete bisogno di ordinare o no? Se lo fai, che un albero può aiutare. Se non lo fai, di una tabella hash, che è più veloce potrebbe essere utilizzato al posto.

Hai un sacco di dati, che non si adatta la memoria? Se sì di una soluzione basata su disco aiuterebbero (come BTree). Se i dati in forma la memoria, che l'uso il più veloce in memoria della soluzione e l'utilizzo del disco solo come un deposito (con una struttura diversa, molto più semplice).

scroll top