Strategia più efficiente per la ricerca di ampie aree di testo per più valori

3

Ho un requisito per un servizio che fa quanto segue.

Prendi un blocco di testo e identifica i nomi dei server in esso contenuti (per nome o indirizzo ip). Così dato:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero felis, accumsan in nunc id, lacinia rutrum libero. Server1 Praesent iaculis consequat est quis elementum. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos Server2 himenaeos. Cras aliquet nisl non tortor interdum semper. Nulla commodo dignissim justo, eu accumsan neque eleifend ut. Etiam malesuada volutpat dolor 192.168.0.2 laoreet placerat. Maecenas posuere ipsum mattis egestas elementum.

Il servizio restituirebbe:

  • Server1
  • Server2
  • Server3 (che ha indirizzo IP 192.168.0.2)

ci sono circa 7000 server e indirizzi nel mio DB. Quindi al momento l'unica strategia che ho è prendere il blocco di testo come una stringa e fare un ciclo su tutti i server due volte (nome e ip) emettendo una stringa .Contains ().

L'emissione di 14.000 contenitori sembra un po '"forza bruta". C'è un modo più elegante per ottenere lo stesso risultato.

Per contesto questo è un servizio di riposo in esecuzione su ASP.Net MVC e C #.

    
posta Lobsterpants 18.04.2016 - 08:09
fonte

2 risposte

4

Se il tuo codice attuale è semplice e abbastanza veloce per le tue esigenze, non fare nulla. Solo per ottimizzare perché "sembra un po 'bruta forza" non è una buona ragione, complicherà soprattutto le cose senza alcun beneficio. Non cadere nella trappola dell'ottimizzazione prematura.

Tuttavia, se il tuo codice attuale è veramente troppo lento per i tuoi scopi, prima devi misurare dove si trova il collo di bottiglia. Si chiama davvero 14.000 volte string.Contains , o sta selezionando i 14.000 nomi di server / indirizzi IP dal tuo database? Il primo problema potrebbe essere affrontato dividendo il testo in parole che potrebbero essere potenzialmente un nome di server e utilizzando un hashset o una struttura di dati più sofisticata. Il secondo problema potrebbe essere affrontato dividendo il testo allo stesso modo, utilizzando le parole come criterio SELEZIONA, presupponendo che il database sia indicizzato correttamente. Quest'ultimo potrebbe aumentare il numero di roundtrip, per evitare che, potresti implementare una procedura memorizzata nel tuo DB, passare il testo una volta sulla rete e lasciare che l'SP faccia il lavoro.

Tutte queste soluzioni, tuttavia, si traducono in un codice più complicato di quello che hai ora, quindi assicurati che valga la pena, altrimenti probabilmente stai sacrificando una soluzione manutenibile per inutili complicazioni.

    
risposta data 18.04.2016 - 08:56
fonte
1

Un'opzione consisterebbe nell'utilizzare espressioni regolari: crea un'espressione regolare che corrisponda a qualsiasi server (nel tuo caso sarebbe Server1|Server2|192\.168\.0\.2 , puoi costruirla utilizzando qualcosa come string.Join("|", servers.Select(Regex.Escape)) ).

Non dimenticare l'opzione per compilare il regex, che potrebbe accelerarlo in modo significativo.

    
risposta data 18.04.2016 - 18:54
fonte

Leggi altre domande sui tag