gpt4 book ai didi

c# - Parallel.Foreach 被卡住但服务继续响应

转载 作者:行者123 更新时间:2023-11-30 16:47:11 28 4
gpt4 key购买 nike

设计:我的 C# WCF 进程必须在内存中缓存大量数据(如字典)——进程占用的内存增长超过 1.5GB。缓存中的数据或多或少来自数据库(使用 Entity Framework )。缓存的构建方式是:选择表上的查询以从表中获取主键列表(比如字符串列表)。假设我得到一个包含 1000 个项目的列表。现在我在这个主键列表上执行 Parallel.Foreach 并且(foreach 的主体)操作是转到数据库并获取该键的所有数据(即从表中选择 *,其中 KeyColumn = 循环项)。对数据进行一些操作,然后将其添加到缓存(字典)中。

问题:当进程/可执行文件启动时。它消耗了几乎 95% 的 CPU(这很好)并且占用了 RAM(比如 1.3 或 1.4 GB)。将运行良好,直到前 10-12 分钟。但不知何故,CPU 下降到 15-17% RAM,稳定在 1.4GB(还有更多)。我可以看到数据库中的几个项目尚未添加到缓存中。这种卡住状态会持续很长时间(有时 10 小时),然后一切都会处理,所有数据都在我的缓存中。 RAM 现在稳定在 1.5GB 左右。我认为 GC 循环会卡住应用程序线程,但随后(因为它是 WCF 服务)任何服务方法调用都会响应。它唯一的并行线程部分似乎每次都卡住,每次以相同的 RAM 大小重新启动......并且数据明智的相同的项目集每次都从缓存中丢失。我已验证那些众所周知丢失的 key 的数据没有任何不同。

寻找任何关于似乎有问题的指示?

编辑

简单来说,我的代码流程如下:

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;
}

最佳答案

编写此更新,以便其他人可以从中受益。任务并行库在我的案例中是完美的。问题出在我的数据处理步骤之一。我正在使用正则表达式,我的一个正则表达式出现了“Catastrophic Backtracking

我修复了 Regex,它的运行速度非常快(几分钟内)。感谢大家的建议,即使我发布了错误的问题。错过这样一个小错误感觉很傻。

关于c# - Parallel.Foreach 被卡住但服务继续响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39879087/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com