问题标签 [plinq]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
2172 浏览

c# - 将此 foreach 循环转换为并行执行的正确 PLINQ 语法是什么?

2011 年 5 月 20 日上午 12:49 更新:对于我的应用程序,foreach 仍然比并行解决方案快 25%。并且不要将收集计数用于最大并行度,使用更接近机器上核心数量的东西。

=

我有一个 IO 绑定任务,我想并行运行。我想对文件夹中的每个文件应用相同的操作。在内部,该操作会产生一个 Dispatcher.Invoke,它将计算的文件信息添加到 UI 线程上的集合中。所以,从某种意义上说,工作结果是方法调用的副作用,而不是方法调用直接返回的值。

这是我要并行运行的核心循环

这个循环的上下文在这里:

谢谢你的帮助!

+汤姆

0 投票
2 回答
1194 浏览

c# - ConcurrentQueue 上的 PLINQ 不是多线程

我在 C# 程序中有以下 PLINQ 语句:

两者都是ConcurrentQueuesarrestQueue_writeQueue

没有并行运行:

  • 运行时,总 CPU 使用率约为 30%,这也是所有其他运行的情况。我有 8 个内核(具有 4 个物理内核的 Core i7 720QM 上的超线程),8 个内核中有 4 个几乎没有任何利用率。其余的运行大约 40%-50%。
  • 磁盘使用率通常为 0%,除了查询本地主机上的 Postgres 数据库外,没有网络使用情况(见下文)。
  • 如果我在内部某处添加断点geocodeThis.Geocode(),Visual Studio 的Thread下拉列表只会显示[ pid ] Main Thread。它永远不会进入任何其他线程。
  • 我正在使用Npgsql连接到 Postgres,并且每个线程对一个表运行一些SELECT查询。我正在运行 pgAdmin III 的服务器状态应用程序,它显示pg_stat_activity。通过监控这一点,以及战略断点放置(见上文),我可以看到应用程序永远不会为所有假定的并发线程打开超过 1 个数据库连接geocodeThis.Geocode()。即使我将Pooling=false添加到数据库连接字符串中,以强制连接不被池化,我也从未看到超过 1 个连接在geocodeThis.Geocode().
  • Postgres 表在WHERE子句中的每一列上都有索引。即使它的索引很差,我也希望有大量的磁盘使用。如果 Postgres 以任何其他方式支撑事情,似乎它会吸收核心。

这似乎是一个简单的 PLINQ 案例研究,我正在为为什么没有并行运行而摸不着头脑。

0 投票
0 回答
264 浏览

.net - 在 DomainService 查询操作中使用 Plinq 的任何性能改进

如果我在我的域服务的查询操作中使用 .AsParallel() 扩展名,我能期待任何性能改进吗?DomainService 使用存储库 (EntityFramework) 来查询数据并为查询操作返回的客户端构建 ViewModel。

这是我的 DomainService 中的一个简单查询操作:

如果我可以使用 PLinq 加快速度,我应该在哪里添加 .AsParallel() 调用?

这里

那里

或者那里

0 投票
2 回答
1462 浏览

c# - 优化大型 csv 文件写入器 - 使用 TPL PLINQ 的大型表数据读取器

关于如何使用 TPL 和/或 PLINQ 进一步优化的任何提示。

下面的代码在后台工作人员上运行

谢谢你。

0 投票
2 回答
243 浏览

linq - C#:链式 Linq 方法和强制转换

我有一个小游戏,我在其中实现了一些碰撞检测。现在我想获取与当前“实体”对象发生冲突的特定类型的所有项目的列表。我想做这样的事情:

我收到以下错误:

谁能解释一下,为什么会这样?

谢谢!

0 投票
3 回答
251 浏览

c# - 特定的 plinq 查询

我想选择一个在 C# 中具有最大值的 iddictionary<int, double>

例如

初始字典

选择后

我当前的代码

0 投票
3 回答
4881 浏览

c# - PLINQ:如何在超过 4 个线程上运行 ParallelQuery?

更新 - 更改了问题的标题以反映我真正追求的内容

考虑以下代码:

当省略对 的调用时WithDegreeOfParallelism,它分 4 个块执行,总共需要大约 4 秒,这是我所期望的,因为我的 CPU 计数是 3。

但是,当用任何大于 4 的数字调用WithDegreeOfParallelism时,我总是得到 3 个块,并且总持续时间不低于 3 秒。我预计 12 的值将获得(略多于)1 秒的总持续时间。

我错过了什么?以及如何强制并行执行超过 4 个非 CPU 密集型任务,这就是我所追求的?

更新:我当然可以回去手动启动线程,但我希望新的 PFX 库能让这更容易一些......无论如何,下面的代码给了我大约 1 秒的总执行时间

0 投票
3 回答
739 浏览

c# - 如何在 WinForms 应用程序中取消 PLINQ 查询

我正在开发处理大量文本数据收集单词出现统计信息的应用程序(请参阅:源代码词云)。

这是我的代码的简化核心正在做什么。

  1. 枚举所有带有 *.txt 扩展名的文件。
  2. 枚举每个文本文件中的单词。
  3. 按单词分组并计算出现次数。
  4. 按出现次数排序。
  5. 输出前 20 名。

LINQ 一切正常。迁移到 PLINQ 给我带来了显着的性能提升。但是......在长时间运行的查询期间的可取消性丢失了。

似乎 OrderBy 查询正在将数据同步回主线程,并且未处理 windows 消息。

在下面的示例中,我根据MSDN How to: Cancel a PLINQ Query 来演示我的取消实现,它不起作用:(

还有其他想法吗?

0 投票
7 回答
62041 浏览

c# - 何时处置 CancellationTokenSource?

该类CancellationTokenSource是一次性的。快速浏览一下 Reflector 就证明KernelEvent了(很可能)非托管资源的使用。由于CancellationTokenSource没有终结器,如果我们不处置它,GC 就不会这样做。

另一方面,如果您查看 MSDN 文章Cancellation in Managed Threads中列出的示例,则只有一个代码片段处理了令牌。

在代码中处理它的正确方法是什么?

  1. using如果您不等待,则无法包装开始并行任务的代码。只有在您不等待的情况下取消才有意义。
  2. 当然,您可以ContinueWith通过调用添加任务Dispose,但这是要走的路吗?
  3. 可取消的 PLINQ 查询不同步回来,但只是在最后做一些事情呢?比方说.ForAll(x => Console.Write(x))
  4. 它可以重复使用吗?是否可以将同一个令牌用于多个调用,然后将其与宿主组件一起处置,比如 UI 控件?

因为它没有类似于Reset清理IsCancelRequestedToken字段的方法,所以我认为它不可重用,因此每次启动任务(或 PLINQ 查询)时,都应该创建一个新任务。这是真的吗?Dispose如果是,我的问题是在这些情况下处理的正确和推荐策略是什么CancellationTokenSource

0 投票
2 回答
4229 浏览

c# - Task.Wait 在 ContinueWhenAll 操作

我正在努力将线程合并到我的 azure 代码中,以便将事物放入队列中。为此,我使用http://www.microsoft.com/download/en/details.aspx?id=19222作为参考。

我将多条消息排入队列的代码如下所示:

现在我的问题是关于继续中的 Task.Wait (根据 MS 提供的文档)。等待您已经知道已经完成的线程似乎有点奇怪,对吗?我能想象的唯一原因是冒泡错误并处理这些错误。我在这里错过了什么吗?