2017-07-25 22 views
0

我正在搜索網絡文件中的特定文本。用戶輸入文字。有大約850個文件需要搜索。下面的代碼完成了我想要的,但需要大約11-13秒。此代碼位於我使用$ .ajax GET從網頁調用的Web服務中。有沒有一種方法可以提高代碼的搜索速度?或者我應該看看其他領域而不是我的代碼?搜索文件內容的最快方法

由於文件的創建方式(他們使用MS Word創建網絡文件......另一場戰鬥),我在文檔中進行了替換,它改進了我的搜索結果。

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

您需要剖析您的代碼以瞭解在哪裏花費時間。有一個非常好的機會,瘋狂浪費的代碼在帖子中顯示大量未使用的字符串並不重要,因爲它仍然需要花費同樣的時間來閱讀文件。 (事實上​​,服務器不支持Word,所以可能根本無法工作) –

回答

0

也許你應該嘗試使用Parallel.Foreach而不是foreach循環來避免從磁盤順序地等待每個文件。

+0

您知道,我忘記了Parallel.Foreach。我會嘗試的。 – Wannabe

+0

請告訴我有關結果。 –

+0

將我的搜索縮減至8秒。謝謝。 – Wannabe