【问题标题】:filtering large DataTable in for loop在 for 循环中过滤大型 DataTable
【发布时间】:2016-03-11 09:56:45
【问题描述】:

我有一个 Row.Count=2.000.000 和两列包含整数值的 DataTable。

所以我需要的是有效地循环过滤数据表。

我正在这样做;

for (int i= 0; i< HugeDataTable.Rows.Count; i++)
{
  tempIp= int.Parse(HugeDataTable.Rows[i]["col1"].ToString());

  var filteredUsers = tumu.Select("col1= " + tempIp.ToString()).Select(dr => dr.Field<int>("col2")).ToList(); 

HashSet<int> filtered = new HashSet<int>(filteredUsersByJob2);

  Boolean[] userVector2 = userVectorBase
      .Select(item => filtered.Contains(item))
      .ToArray();

  ...
}

我应该怎么做才能提高性能。我需要每一个小技巧。数据表索引,linq 搜索是我想出的谷歌搜索。我想听听你的建议。 谢谢。

【问题讨论】:

  • 为什么DataTable 中有 2m 行?为什么不先在数据库端过滤呢?
  • @Lloyd 怎么说“为什么不先在数据库端过滤它?”。但无论如何,您可以使用AsParallel(),如果您有 2 个或更多内核,它将提高查询速度。用法:filteredUsers = tumu.AsParallel().Select("col1= " + tempIp.ToString()).Select(dr =&gt; dr.Field&lt;int&gt;("col2")).ToList();
  • 这里描述了一些方法stackoverflow.com/questions/2832304/…

标签: c# performance filter datatable


【解决方案1】:

您可以使用 Parallel.For

Parallel.For(0, table.Rows.Count, rowIndex => {
var row = table.Rows[rowIndex];
// put your per-row calculation here});

Please have a look at this post

【讨论】:

    【解决方案2】:

    您正在使用双 for 循环。如果你的 tumu 包含很多行,它会很慢。

    修复:在 for 循环之前创建包含所有用户的字典。在你的 for 循环中检查字典。

    类似这样的:

    Dictionary<string, id> usersByCode;//Init + fill it in
    for (int i= 0; i< HugeDataTable.Rows.Count; i++)
    {
      tempIp= int.Parse(HugeDataTable.Rows[i]["col1"].ToString());
      if(usersByCode.Contains(tempId) 
      {
        //Do something
      }
    }
    

    【讨论】:

    • 我忘了说,但我的 col1 和 col2 不是唯一的
    • 如果每个键有多个记录,您也可以使用 Dictionary>。
    猜你喜欢
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多