并行.Foreach被冻结,但服务继续响应

本文关键字:服务 继续 响应 Foreach 冻结 并行 | 更新日期: 2023-09-27 18:11:35

设计:我的C#WCF进程必须在内存中缓存大量数据(作为字典(-进程占用的内存增长超过1.5GB。缓存中的数据或多或少是来自数据库的数据(使用实体框架(。构建缓存的方式是:在表上选择query,从表中获取主键列表(比如字符串列表(。假设我得到一份1000件物品的清单。现在我在这个主键列表上执行Parallel.Foreach,(Foreach的主体(操作是转到DB并获取该键的所有数据(即从KeyColumn=循环项的表中选择*(。对数据应用一些操作,然后将其添加到缓存(字典(中。

问题:进程/可执行文件启动时。它几乎消耗了95%的CPU(这很好(,占用了RAM(比如增加了1.3或1.4 GB(。运行良好,直到前10-12分钟。但不知什么原因,CPU下降到15-17%,RAM稳定在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;
}

并行.Foreach被冻结,但服务继续响应

编写此更新,以便其他人可以从中受益。任务并行库在我的情况下是完美的。问题出现在我的一个数据处理步骤中。我正在使用正则表达式,我的一个正则表达式遭受了"灾难性回溯">

我修复了Regex,它工作得很快(几分钟内(。感谢大家的建议,即使我发布了错误的问题。错过了这么小的错误,感觉很傻。