gpt4 book ai didi

c#-4.0 - 限制正在进行的流式资源并行操作的工作

转载 作者:行者123 更新时间:2023-12-01 05:31:03 24 4
gpt4 key购买 nike

我发现自己最近在使用 SemaphoreSlim类来限制对(大型)流资源的可并行化操作正在进行的工作:

// The below code is an example of the structure of the code, there are some 
// omissions around handling of tasks that do not run to completion that should be in production code

SemaphoreSlim semaphore = new SemaphoreSlim(Environment.ProcessorCount * someMagicNumber);
foreach (var result in StreamResults())
{
semaphore.Wait();
var task = DoWorkAsync(result).ContinueWith(t => semaphore.Release());
...
}

这是为了避免将太多结果带入内存而程序无法处理(通常通过 OutOfMemoryException 证明)。尽管代码有效并且性能合理,但它仍然感觉很笨拙。值得注意的是 someMagicNumber乘数虽然通过分析进行了调整,但可能不是最佳的,并且不能适应 DoWorkAsync 的实现的变化。 .

就像线程池可以克服调度许多事物执行的障碍一样,我希望能够克服调度许多事物以根据可用资源加载到内存中的障碍。

由于确定是否会发生 OutOfMemoryException 是绝对不可能的,我很感激我正在寻找的东西可能只能通过统计手段来实现,甚至根本无法实现,但我希望我遗漏了一些东西。

最佳答案

在这里,我想说您可能对这个问题想得太多了。过冲的后果相当严重(程序崩溃)。太低的后果是程序可能会变慢。只要您还有一些超出最小值的缓冲区,缓冲区的进一步增加通常几乎没有影响,除非管道中该任务的处理时间非常不稳定。

如果您的缓冲区不断被填满,这通常意味着管道中它之前的任务执行得比它后面的任务快得多,因此即使没有相当小的缓冲区,它也可能始终确保其后面的任务有一些工作.获得缓冲区 90% 的好处所需的缓冲区大小通常会非常小(可能只有几十个项目),而获得 OOM 错误所需的一侧就像 6+ 大亨的数量级。只要你介于这两个数字之间(这是一个相当大的范围),你就会没事。

只需运行您的静态测试,选择一个静态数字,或者为“以防万一”多加几个百分点,您应该会很好。最多,我会将一些魔数(Magic Number)移动到配置文件中,以便在输入数据或机器规范发生根本变化时无需重新编译即可更改它们。

关于c#-4.0 - 限制正在进行的流式资源并行操作的工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11159294/

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