【问题标题】:C# Linq Performance with a Large list具有大型列表的 C# Linq 性能
【发布时间】:2015-02-20 20:23:15
【问题描述】:

我有一个应用程序,它基本上采用一个列表(由用户提交)并为列表中的每个项目返回一组数据。我的主要问题是我有一个很大的集合,我存储在内存中以避免每次都必须查询数据库的成本,但我的查询仍然需要近 0.5 秒,而且时间太长了。

该集合是美国和加州的邮政编码,拥有近 100 万条记录。来自用户的列表从几十到几千条记录不等,我需要为每条记录都这样做,因此对于大型列表来说非常耗时。这是查询:

var resultList = PostalCodeList.Where(p => p.postalcode == userPostalCode).ToList();

邮政编码列表还有其他相关数据(国家、地区等)也需要返回给用户。一共5个字段。所有字符串。

数据的组织方式有可能给定值有 2 个结果,所以我需要考虑这一点。

任何想法或建议都会很棒。谢谢!

【问题讨论】:

  • 如何显示您用于填充和/或返回列表将使用的数据的查询。您还检查了数据库是否针对该特定表进行了优化有需要添加的索引或缺少的索引..等等...??
  • 我会使用Dictionary来存储信息(而不是列表)。
  • @DJKRAZE 对于他所说的,列表使用的数据在内存中,因此程序不必为接收到的列表中的每个元素查询数据库
  • 使用字典或哈希集,用于快速查找
  • 我认为你的基本假设是不正确的。您不一定通过将所有内容保存在本地内存中来加快处理速度。像这样的查找是数据库旨在处理的。除非您通过鸽子使用 TCP/IP 访问数据库,否则我只会让数据库执行其设计的任务。

标签: c# performance linq list


【解决方案1】:

查询数据库是否会损害性能,或者您是否出于对数据库的恐惧而将数据缓存在这里?如果是后者,您可能会发现单个查询更适合您的需求,并且应该仅在遇到数据库性能问题时进行优化。

也就是说,您可能会不必要地使用ToList()。如果您对结果所做的只是foreach,那么您所做的就是枚举集合两次(一次用于ToList(),第二次用于foreach)。如果可能,删除ToList() 并直接使用Where() 的结果。如果列表的迭代是主要开销,那么您应该会发现这将您的查找时间减少了大约一半。

除此之外,正如其他人在他们的 cmets 中对您的原始问题所述,您可能会发现切换到支持快速查找的方法(即哈希集)是完全回避 O(n) 查找时间的唯一方法'会随着集合的增长而遇到。

【讨论】:

  • 如果他们发现数据库太慢,我想知道他们是否在表上有合适的索引来进行查询。
  • 我希望是这样,但我从我能想到的各个角度都在这样做。即使使用索引,每个数据库选项似乎对于任务来说都太慢了(每 1,000 条记录几乎需要 45 秒)。我将尝试 Hashset,看看我们能取得什么样的进展。谢谢!
  • 当您分析 SQL 查询的执行计划时,是什么导致了这种时间安排?它似乎高得不合理。
  • 这是数据的格式。因为我无法直接控制数据结构或此应用程序所需的特定数据,所以我必须执行 4 个连接和 2 个案例语句才能以我需要的方式获取数据。它并不理想,但它是我需要的。这就是为什么我选择预先加载整个列表。
猜你喜欢
  • 1970-01-01
  • 2013-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-06
  • 1970-01-01
相关资源
最近更新 更多