【问题标题】:Efficiently match a large list of Objects to csv header map有效地将大量对象与 csv 标头映射匹配
【发布时间】:2014-06-22 14:57:42
【问题描述】:

我正在处理大量数据对象,我需要能够根据 csv 标头映射将它们转换为文本文件。标题映射基本上是需要按特定顺序打印的字段列表,例如如果 header map 是:ID、Name、Location 等,那么所有对象的这三个字段都需要写入 csv 文件。

问题在于对象列表可能以百万计,而标题映射中可能有数百个字段名 - 这些字段名始终是对象中的有效字段名。目前,我正在使用的代码迭代整个对象列表,并在所有 csv 值的映射上使用 switch 语句来打印出所需的字段。代码如下所示:

foreach (Object o in Objects)
{
    foreach (String FieldName in CsvFieldsList)
    {
        switch (FieldName)
        {
              case "ID":
                 //Do something for this specific ID:
                 outString.Append(o.ID);
                 break;
                 ....
                 ....
        }

    }

}

AFAIK,C# 将为字符串 switch 语句使用字典,因此这些语句应该很快,但是,对于我们的一些大型数据集,此代码需要数小时,我想知道是否有可能改进此设计。

【问题讨论】:

  • 也许this 的帖子会有所帮助。解释提高性能的方法。
  • 你对foreach循环中的o对象做了什么?
  • 对象具有不同类型的属性,即字符串、整数、布尔值等,我们将它们转换为字符串表示法。请注意,其中一些属性需要额外的处理。我还更新了代码,让您了解典型(不是全部)开关盒的外观。
  • 您的运行时间为 O(m * n),其中 m 是 Objects.Count,n 是 CsvFieldsList.Count。如果您可以将 Objects 和 CsvFieldsList 放入字典并通过查找检索数据,那么您应该能够获得 O(m + n) 的运行时间
  • 我的理解是 C# switch 语句使用字典来处理大量的字符串情况。我不确定手动使用字典是否会产生明显的效果。

标签: c# performance algorithm dataset bigdata


【解决方案1】:

您可以尝试一些并行方法。例如,将对象拆分为一些小对象,然后在单独的线程或进程中处理每个小对象。每个线程或进程写入一个单独的 csv 文件,在所有线程或进程完成后,将这些 csv 文件组合在一起。

【讨论】:

  • 我们已经尝试过使用多线程并且它有所帮助。我很好奇这个问题是否有更好的算法/方法。
猜你喜欢
  • 1970-01-01
  • 2022-10-06
  • 2018-10-28
  • 2018-01-09
  • 2020-02-13
  • 1970-01-01
  • 2020-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多