簡體   English   中英

Parallel.Foreach被凍結但服務繼續響應

[英]Parallel.Foreach gets frozen but service continues to respond

設計:我的C#WCF進程必須在內存中緩存大量數據(如字典) - 進程占用的內存增長超過1.5GB。 Cache中的數據或多或少來自數據庫(使用實體框架)。 構建緩存的方式是:在表上選擇查詢以從表中獲取主鍵列表(比如字符串列表)。 假設我得到1000個項目的列表。 現在我在這個主鍵列表上執行Parallel.Foreach,並且(foreach主體)操作是轉到DB並獲取該鍵的所有數據(即select * from table from KeyColumn = loop item)。 對數據應用一些操作,然后將其添加到Cache(Dictionary)中。

問題:進程/可執行文件啟動時。 它占用了近95%的CPU(這是好的)並占用RAM(比如說高達1.3或1.4 GB)。 一直運行到最初的10-12分鍾。 但是,由於沒有眾所周知的原因,CPU的內存穩定在15-17%,穩定在1.4GB(還有更多)。 我可以看到數據庫中的幾個項目尚未添加到緩存中。 這種凍結狀態持續很長時間(有時10小時),然后一切都會處理,所有數據都在我的緩存中。 RAM現在穩定在1.5GB左右。 我認為GC循環會凍結應用程序線程,但隨后(因為它是一個WCF服務)任何服務方法調用都會響應。 它唯一的是並行線程部分,它似乎每次都凍結,每次重啟都在相同的RAM大小。和數據明智的同一組項目每次從緩存中丟失。 我已經確認數據中沒有任何不同之處。

尋找關於什么似乎是錯誤的任何指針?

編輯

在簡單術語中,我的代碼流程如下:

ConcurrentDictionary<string, string> MyCache = new ConcurrentDictionary<string, string>();

private List<string> GetPrimaryKeysFromDB()
{
using(var ctx = new MyDBContext())
{
List<string> results = ctx.MyTable.Select(x=>x.PrimeColumn).ToList();
return results;
}
}

private void SomeMethod()
{
List<string> ListOfPrimeItems = GetPrimaryKeysFromDB();

Parallel.Foreach(ListOfPrimeItems, #MaxDopSetting#, k =>
  {
ProcessDataForKey(k);
  });
}

private void ProcessDataForKey(string key)
{
// Goto DB and fetch record for key
// Each column (Entity data member) will undergo some processing here
// some string manipulations
// Finally convert the new state of data to XML (serialize) and store in cache
MyCache[key] = TranslatedStateOfData;
}

編寫此更新,以便其他人可以從中受益。 在我的案例中,任務並行庫是完美的。 問題發生在我的一個數據處理步驟中。 我正在使用正則表達式,我的一個正則表達式遭受“ 災難性的回溯

我修復了正則表達式,它的工作速度非常快(幾分鍾之內)。 謝謝大家的建議,即使我發布了錯誤的問題。 感到愚蠢,錯過了這樣一個小錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM