GNU/Linux >> Linux Esercitazione >  >> Linux

Come velocizzare una ricerca su un'ampia raccolta di file di testo (1 TB)

Ci sono già molte risposte, volevo solo aggiungere i miei due centesimi:

  1. Avere così tanti dati enormi (1 TB) con solo 8 GB di memoria non sarà sufficiente per qualsiasi approccio, che si tratti di utilizzare Lucene o Elasticsearch (utilizza internamente Lucene) o qualche comando grep se si desidera una ricerca più veloce, il la ragione è molto semplice, tutti questi sistemi conservano i dati nella memoria più veloce per essere in grado di servire più velocemente e su 8 GB (25% dovresti riservare per il sistema operativo e un altro 25-50% almeno per altre applicazioni), ti rimane molto pochi GB di RAM.
  2. L'aggiornamento dell'SSD, l'aumento della RAM sul tuo sistema ti aiuteranno, ma è piuttosto ingombrante e, di nuovo, se riscontri problemi di prestazioni, sarà difficile eseguire il ridimensionamento verticale del tuo sistema.

Suggerimento

  1. So che hai già detto che vuoi farlo sul tuo sistema ma come ho detto non darebbe alcun vantaggio reale e potresti finire per perdere così tanto tempo (infra e dal punto di vista del codice (tanti approcci come menzionato in varie risposte)), quindi suggerirei di eseguire l'approccio dall'alto verso il basso come menzionato nella mia altra risposta per determinare la giusta capacità. Ti aiuterebbe a identificare rapidamente la capacità corretta di qualsiasi approccio tu scelga.
  2. Per quanto riguarda l'implementazione, suggerirei di farlo con Elasticsearch (ES), poiché è molto facile da configurare e ridimensionare, puoi persino utilizzare AWS Elasticsearch che è disponibile anche nel livello gratuito e successivamente su scala rapida, anche se io non sono un grande fan di AWS ES, fa risparmiare molto tempo nella configurazione e puoi iniziare rapidamente se hai molta familiarità con ES.

  3. Per rendere la ricerca più veloce, puoi dividere il file in più campi (titolo, corpo, tag, autore ecc.) e indicizzare solo il campo importante, che ridurrebbe la dimensione dell'indice invertito e se stai cercando solo la corrispondenza esatta della stringa ( nessuna ricerca parziale o full-text), allora puoi semplicemente usare il keyword campo che è ancora più veloce da indicizzare e cercare.

  4. Posso continuare a spiegare perché Elasticsearch è buono e come ottimizzarlo, ma non è questo il punto cruciale e la linea di fondo è che qualsiasi ricerca avrà bisogno di una quantità significativa di memoria, CPU e disco e chiunque diventi un collo di bottiglia ostacolerebbe la ricerca del tuo sistema locale e altre applicazioni, quindi ti consigliamo di considerare davvero di farlo su un sistema esterno ed Elasticsearch si distingue davvero come mezzo per il sistema distribuito e il sistema di ricerca open source più popolare oggi.

Hai chiaramente bisogno di un indice, come suggerito da quasi tutte le risposte. Potresti migliorare totalmente il tuo hardware, ma dato che hai detto che è stato risolto, non mi dilungherò in merito.

Ho alcuni suggerimenti pertinenti per te:

  1. Indicizza solo i campi in cui desideri trovare il termine di ricerca anziché indicizzare l'intero set di dati;
  2. Crea un indice multilivello (ovvero indice su indice) in modo che le tue ricerche nell'indice siano più veloci. Ciò sarà particolarmente rilevante se il tuo indice supera gli 8 GB;
  3. In alternativa, vorrei consigliare la memorizzazione nella cache delle tue ricerche, ma in questo modo una nuova ricerca richiederà di nuovo mezza giornata. Pertanto, la preelaborazione dei dati per creare un indice è chiaramente migliore rispetto all'elaborazione dei dati man mano che arriva la query.

Aggiornamento minore:

Molte risposte qui ti suggeriscono di mettere i dati in Cloud. Consiglio vivamente, anche per i dati medici resi anonimi, di confermare con la fonte (a meno che tu non abbia prelevato i dati dal Web) che è consentito farlo.


Per velocizzare le tue ricerche hai bisogno di un indice invertito. Per poter aggiungere nuovi documenti senza la necessità di reindicizzare tutti i file esistenti, l'indice dovrebbe essere incrementale.

Uno dei primi progetti open source che ha introdotto l'indicizzazione incrementale è Apache Lucense. È ancora il motore di indicizzazione e di ricerca più utilizzato, sebbene al giorno d'oggi siano più popolari altri strumenti che ne estendono le funzionalità. Elasiticsearch e Solr sono entrambi basati su Lucense. Ma finché non hai bisogno di un frontend web, supporto per query analitiche, filtraggio, raggruppamento, supporto per l'indicizzazione di file non di testo o un'infrastruttura per la configurazione di un cluster su più host, Lucene è ancora la scelta migliore.

Apache Lucense è una libreria Java, ma viene fornita con un'applicazione demo basata su riga di comando completamente funzionante. Questa demo di base dovrebbe già fornire tutte le funzionalità di cui hai bisogno.

Con una certa conoscenza di Java sarebbe anche facile adattare l'applicazione alle proprie esigenze. Sarai sorpreso di quanto sia semplice il codice sorgente dell'applicazione demo. Se Java non dovrebbe essere il linguaggio di tua scelta, anche il suo wrapper per Pyhton, PyLucene potrebbe essere un'alternativa. L'indicizzazione dell'applicazione demo è già ridotta quasi al minimo. Per impostazione predefinita, non viene utilizzata alcuna funzionalità avanzata come lo stemming o l'ottimizzazione per query complesse:funzionalità che molto probabilmente non ti serviranno per il tuo caso d'uso ma che aumenterebbero le dimensioni dell'indice e il tempo di indicizzazione.


Linux
  1. Come utilizzare il comando Grep per trovare testo nei file

  2. Come unire due file di testo in Linux

  3. Come verificare la presenza di file di grandi dimensioni nella console

  4. Come trovare file su Ubuntu?

  5. Come velocizzare la ricerca in Dash?

Scripting Bash:come scrivere dati su file di testo

Come spostare un gran numero di file in Linux

Come copiare un gran numero di file in Linux

Come trovare file contenenti una stringa di testo specifica in Linux

Come Gzip file di grandi dimensioni (100 GB+) più velocemente in Linux

Come utilizzare più comandi in Linux per leggere file di testo di grandi dimensioni