gpt4 book ai didi

performance - 与 Entity Framework 平行。与启动多个可执行文件相比,性能是惊人的,为什么呢?

转载 作者:行者123 更新时间:2023-12-03 09:44:49 27 4
gpt4 key购买 nike

我想知道你们中的任何一个人为什么知道我的表现糟透了吗?

我正在努力实现的目标;
生成220万个文件。要创建每个文件,平均需要2-5个数据库调用。

我正在使用的服务器具有24个内核和190GB的RAM。

我将需要生成的文件分成24批。

乳清我使用下面的代码,我得到糟糕的表现。生成过程需要一个多小时。

Parrallel.ForEach(batches, batch => 
{
using (var ctx = new MyContext())
{
for each(var file in batch.Files)
{
GenerateFile(file);
}
}
});

但是,当我确保程序接收到参数时,程序就知道要生成哪个批处理,因此不需要使用并行功能。如果我使用以下.bat文件为每个批处理执行该程序;
START CaMaakEiBericht.exe \B1
START CaMaakEiBericht.exe \B2
...
START CaMaakEiBericht.exe \B24

它运行速度惊人!整个生成过程耗时不到15分钟!
此批处理文件还确保每个内核的cpu使用率约为90%。当我使用并行方法时,我只能获得30-40%的使用率。

有人对此有合乎逻辑的解释吗?我对这个项目感到满意,因为我终于可以将.NET 4 Parallel库与EF结合使用,但是不幸的是,它让我很失望:-)

我个人有点怀疑EF是这里的瓶颈...它是否在内部缓存了一些东西,当多个进程正在获取数据时,这些东西会强加一些锁?

开导我 :-)

最佳答案

关于您的其他EXE文件为何运行良好的原因,我无法发言,但是我可以为您提供的代码提供建议。

您提到将工作分为24个批次,然后在批次列表中使用了ForEach。通过这种设置,似乎我们的24个内核中的每个内核可以一次处理一个文件。我的猜测是这是您的瓶颈。

如果您愿意的话,每个核心可能会做更多的事情。尝试这样的事情:

Parallel.ForEach(batches, batch => 
{
Parallel.ForEach(batch.Files, file =>
{
using (var ctx = new MyContext())
{
GenerateFile(file);
}
}
});

或者,您可以完全摆脱这些批处理,并提供完整的文件列表。任务并行库将为您使用多个内核。
Parallel.ForEach(Files, file => 
{
using (var ctx = new MyContext())
{
GenerateFile(file);
}
});

您可能已经知道这一点,但是请记住 context is not thread safe,因此您必须在最内部的Parallel.ForEach结构内创建一个新的。

关于performance - 与 Entity Framework 平行。与启动多个可执行文件相比,性能是惊人的,为什么呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9229511/

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