【问题标题】:Mass Update a property on multiple records inside a dictionary (VB.NET / C#)批量更新字典内多条记录的属性(VB.NET / C#)
【发布时间】:2019-11-11 17:56:43
【问题描述】:

我有一个 Dictionary (of Long, Class),其中 Class 有多个属性(假设我们有一个名为 Updated as Boolean 的属性。

我想立即将此(更新)属性更新为(真),比如说所有奇数键记录(或基于任何特定规则)。最好的方法是什么?

我的想法是使用 Linq 来获取这些记录,然后(对于每个)它们,但是有没有更好的方法来做到这一点,比如在发生条件的地方进行大规模更新(比如我们在数据库中所做的)?

我的方法的一个例子如下。如果有更好的方法来做这样的更新,不胜感激......

谢谢

Dim ReturnedObjs = From Obj In Dictionary Where Obj.Key Mod 2 = 1
For Each item As KeyValuePair(Of Long, Class) In ReturnedObjs
    item.Value.Updated = True
Next

【问题讨论】:

  • 这听起来像是 Speed Rant 的案例:ericlippert.com/2012/12/17/performance-rant
  • 那么您目前的方法有什么问题?你想解决什么问题?
  • 如果您每 100 毫秒都有数据,并且您想更新 10k 条记录(甚至更多),这将很有用:) 我正在尝试以最好的方式优化它。如果有一种方法可以直接更新所有记录,那就太好了(例如,当我们在 SQL 中说“更新表集属性 = True where Value > 0”时)
  • 您可以为 Linq 编写相当于 For Each 的循环,但即便如此,您也只是隐藏了迭代。我不明白这一点;相当多的 Linq 对查询理解或延迟执行很有用,这不会起到任何作用。您将需要进行迭代,不妨将其明确化(尤其是当您需要更新枚举变量的多个属性时)。

标签: c# .net vb.net linq dictionary


【解决方案1】:

首先,这听起来像是一个明显的速度咆哮案例:

https://ericlippert.com/2012/12/17/performance-rant/

第二个:

最好的方法是将其保存在数据库中。通过在网络上传输数据两次(一次获取,一次返回)并将搜索负载加倍(一次获取所有奇数,一次更新您刚刚更改的所有内容)。我的长期建议是始终在数据库方面保持尽可能多的工作。您的客户端代码永远无法击败它。

第三:

如果您确实需要使用客户端处理:

现在我的很多答案取决于实现的细节、JiT 和通用编译器优化的工作方式等。

Foreach 在枚举器上使用作品,而不是在集合上。但是,如果您将一个集合提供给 foreaach,则会隐式创建一个 Enumerator。现在枚举器确实有两个属性:

  1. 如果集合发生变化,枚举器将变为无效。大多数人了解它们是因为他们遇到了这个问题。
  2. 这是一个额外的函数调用和一组用于访问集合的检查。所以这将是一个放缓。多少很难说,因为优化和 JiT 都非常好。

所以你可能想使用 for 循环。

如果你可以将 Dictionary 变成一个以主键作为索引的集合,它可能会快一点。但是帽子有在数据方面遇到很多“枯燥乏味”的危险,因此它在很大程度上取决于您的源数据。

【讨论】:

  • 好吧,我不认为这是一种“速度咆哮”。我知道一种实现这一点的方法(我把它放在上面可能会对某人有所帮助),并且我正在寻找更好的东西(如果存在的话)(学习新东西总是好的)。如果有更好的方法来做某事,那么为什么不以正确的方式去做呢?即使运行正常。假设我是一个完美主义者,喜欢以最好的方式做事:)
  • 现在回答剩下的问题 ;) 第二点,不幸的是,在 DB 上执行此操作不是一种选择......数据实际上来自前端。并将其发送到服务器以在数据库中处理(对于许多用户)将消耗服务器资源。这就是为什么最好使用我的帖子中描述的 LINQ 语句的更新来分配每个前端的处理。而且我们在数据库上也不需要这个(它对用户来说完全是前端视觉的东西)。
  • 对于第三个建议,我会检查'For Loop',感谢'For Each'的详细解释。我希望有一种方法可以在没有迭代的情况下进行这样的大规模更新:)
  • @AhmadMusa 我希望通过所有这些层级的分离,你考虑了种族条件?特别是更新竞争条件可能导致更新丢失,这听起来像是他们的理想滋生地。
  • @christopher 这与竞争条件场景无关。如前所述,我只是在寻找是否有更好的方法来进行我不知道的更新。该代码正在运行,我没有抱怨。但是对于大量记录,cpu 将开始增加(显然)。所以我想知道我们是否错过了一种不同的技术(搜索了几个网站却没有找到任何东西,因此我的问题在这里)。谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 2019-01-02
  • 2018-05-28
  • 2012-12-10
  • 2021-12-13
  • 1970-01-01
相关资源
最近更新 更多