Domanda

Ecco il problema che sto riscontrando, ho una serie di registri che possono crescere abbastanza rapidamente. Sono divisi in singoli file ogni giorno e i file possono facilmente crescere fino a dimensioni giganti. Per ridurre le dimensioni, le voci più vecchie di circa 30 giorni vengono cancellate.

Il problema è quando voglio cercare questi file per una determinata stringa. In questo momento, una ricerca di Boyer-Moore è incredibilmente lenta. So che applicazioni come dtSearch possono fornire una ricerca molto rapida tramite l'indicizzazione, ma non sono sicuro di come implementarlo senza occupare il doppio dello spazio che occupa già un registro.

Ci sono risorse che posso controllare che possono aiutare? Sto davvero cercando un algoritmo standard che spieghi cosa dovrei fare per costruire un indice e usarlo per la ricerca.

Modifica:
Grep non funzionerà poiché questa ricerca deve essere integrata in un'applicazione multipiattaforma. Non potrò mai oscillare, incluso qualsiasi programma esterno.

Il modo in cui funziona è che esiste un front-end Web con un browser di registro. Questo parla con un backend del server Web C ++ personalizzato. Questo server deve cercare nei log in un ragionevole lasso di tempo. Attualmente la ricerca tra diversi concerti di log richiede secoli.

Modifica 2: Alcuni di questi suggerimenti sono fantastici, ma devo ribadire che non riesco a integrare un'altra applicazione, fa parte del contratto. Ma per rispondere ad alcune domande, i dati nei registri variano dai messaggi ricevuti in un formato specifico di assistenza sanitaria o dai messaggi relativi a questi. Sto cercando di fare affidamento su un indice perché, sebbene la ricostruzione dell'indice possa richiedere fino a un minuto, la ricerca impiega attualmente molto tempo (l'ho visto impiegare fino a 2,5 minuti). Inoltre, molti dati vengono scartati prima ancora di registrarli. A meno che alcune opzioni di registrazione del debug non siano attivate, più della metà dei messaggi di registro viene ignorata.

La ricerca in pratica procede in questo modo: a un utente sul modulo web viene presentato un elenco dei messaggi più recenti (trasmessi in streaming dal disco mentre scorrono, yay per ajax), di solito, vorranno cercare messaggi con alcune informazioni al suo interno, forse un ID paziente o una stringa che hanno inviato, in modo che possano inserire la stringa nella ricerca. La ricerca viene inviata in modo asincrono e il server Web personalizzato cerca in modo lineare nei registri 1 MB alla volta per alcuni risultati. Questo processo può richiedere molto tempo quando i log diventano grandi. Ed è quello che sto cercando di ottimizzare.

È stato utile?

Soluzione

Scopri gli algoritmi che Lucene usa per fare le sue cose. Tuttavia, probabilmente non saranno molto semplici. Ho dovuto studiare alcuni di questi algoritmi una volta, e alcuni sono molto sofisticati.

Se riesci a identificare le " parole " nel testo che si desidera indicizzare, basta creare una grande tabella hash delle parole che associ un hash della parola alle sue occorrenze in ciascun file. Se gli utenti ripetono spesso la stessa ricerca, memorizza nella cache i risultati della ricerca. Al termine della ricerca, puoi controllare ciascuna posizione per confermare che il termine di ricerca rientri lì, anziché solo una parola con un hash corrispondente.

Inoltre, a chi importa davvero se l'indice è più grande dei file stessi? Se il tuo sistema è davvero così grande, con così tanta attività, alcune decine di concerti per un indice sono la fine del mondo?

Altri suggerimenti

grep di solito funziona abbastanza bene per me con registri di grandi dimensioni (a volte 12G +). Puoi trovare una versione per Windows anche qui .

Molto probabilmente vorrai integrare qualche tipo di motore di ricerca di indicizzazione nella tua applicazione. Ce ne sono dozzine là fuori, Lucene sembra essere molto popolare. Controlla queste due domande per altri suggerimenti:

Il miglior motore di ricerca testuale per l'integrazione con il web personalizzato app?

Come posso implementare la funzionalità di ricerca in un sito Web?

Ulteriori dettagli sul tipo di ricerca che stai eseguendo potrebbero sicuramente aiutare. Perché, in particolare, vuoi fare affidamento su un indice, dal momento che dovrai ricostruirlo ogni giorno quando i registri passano sopra? Che tipo di informazioni sono contenute in questi registri? Alcuni possono essere scartati prima ancora di essere registrati?

Quanto tempo impiegano queste ricerche adesso?

Potresti voler controllare la fonte per BSD grep . Potresti non essere in grado di fare affidamento sul fatto che grep sia lì per te, ma nulla dice che non puoi ricreare funzionalità simili, giusto?

Splunk è ottimo per la ricerca attraverso molti registri. Potrebbe essere eccessivo per il tuo scopo. Si paga in base alla quantità di dati (dimensione dei registri) che si desidera elaborare. Sono abbastanza sicuro che abbiano un'API, quindi non devi usare il loro front-end se non vuoi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top