2017-07-25 4 views
0

Ich mache eine Suche nach bestimmten Text in Web-Dateien. Der Benutzer gibt den Text ein. Es gibt ungefähr 850 Dateien, die ich suchen muss. Der Code unten erreicht, was ich will, aber es dauert ungefähr 11-13 Sekunden. Dieser Code befindet sich in einem Webdienst, den ich von einer Webseite mit $ .ajax GET aufrufe. Gibt es eine Möglichkeit, den Code zu verbessern, damit die Suche schneller geht? Oder sollte ich andere Bereiche als meinen Code betrachten?Schnellste Möglichkeit, nach Inhalten von Dateien zu suchen

Ich mache die Ersetzungen im Dokument wegen der Art und Weise wie die Dateien erstellt werden (sie erstellen Web-Dateien mit MS Word ... eine andere Schlacht) und es verbessert meine Suchergebnisse.

var searchResults = new StringBuilder(); 

var parameters = searchParameters.Split('|'); 

var searchOnCompletePhrase = bool.Parse(parameters[1]); 

var completePhrasePattern = @"\b(?:" + Regex.Escape(parameters[0].ToString()) + @")\b"; 

var files = Directory.GetFiles(path, "*.htm"); 

if (searchOnCompletePhrase && searchPhrase.Length > 1) 
{ 
    foreach (var currentFile in files) 
    { 
     document.Load(currentFile); 

     contents = document.DocumentNode.InnerText.Replace("\r", string.Empty) 
      .Replace("\n", string.Empty) 
      .Replace(" ", string.Empty) 
      .Replace(" ", " "); 

     if (contents.ToLower().IndexOf(searchPhrase.ToLower()) > -1) 
     { 
      searchResults.AppendLine(currentFile); 

      searchResults.Append("|"); 
     } 
    } 
} 
else 
{ 
    var keywords = parameters[0].Split(' '); 

    foreach (var currentFile in files) 
    { 
     document.Load(currentFile); 

     contents = document.DocumentNode.InnerText.Replace("\r", string.Empty) 
      .Replace("\n", string.Empty) 
      .Replace(" ", string.Empty) 
      .Replace(" ", " "); 

     var found = true; 

     foreach (var word in keywords) 
     { 
      if (!SearchCurrentWord(word.ToString())) 
      { 
       found = false; 

       break; 
      } 
     } 

     if (found) 
     { 
      searchResults.AppendLine(currentFile); 

      searchResults.Append("|"); 
     } 
    } 
} 
+0

Sie müssen Ihren Code profilieren, um zu verstehen, wo die Zeit verbracht wird. Es gibt eine sehr gute Chance, dass wahnsinnig verschwenderischer Code, der eine Menge ungenutzter Strings erzeugt, die in der Post gezeigt werden, nicht wirklich wichtig ist, da er immer noch die gleiche Zeit benötigt, um Dateien tatsächlich zu lesen. (Darüber hinaus wird Word auf Servern nicht unterstützt - so kann oder kann überhaupt nicht funktionieren) –

Antwort

0

Vielleicht sollten Sie Parallel.Foreach anstelle von foreach-Schleife versuchen, um zu vermeiden, jede Datei von der Festplatte der Reihe nach zu warten.

+0

Weißt du, ich habe über Parallel.Foreach vergessen. Ich werde es versuchen. – Wannabe

+0

Bitte informieren Sie mich über das Ergebnis. –

+0

Das hat meine Suche auf 8 Sekunden reduziert. Vielen Dank. – Wannabe

Verwandte Themen