代码之家  ›  专栏  ›  技术社区  ›  Stefan Haubold

更快(更具可扩展性)的数据集。合并?

  •  1
  • Stefan Haubold  · 技术社区  · 17 年前

    我们在应用程序中使用强类型数据集。导入数据时,我们使用方便的 DataSet.Merge()

    StringCollection lines = ReadFromFile(fileName);
    foreach (string line in lines)
    {
        DataRow dr = ImportRow(line);
        dataSet1.Merge( new DataRow[] { dr } );
    }
    DoAdditionalCalculationsWith(dataset1);
    SaveToDatabase(dataSet1);
    

    不幸的是,这无法扩展。对于较大的导入,合并占据了我们总导入时间的80%(根据我们的分析器)。

    我们不能只添加行,因为它们可能已经在数据集中了,在数据库中也不能这样做,因为我们的导入逻辑非常复杂。

    5 回复  |  直到 16 年前
        1
  •  2
  •   Eamon Nerbonne    17 年前

    您可能已经尝试过这个,但以防万一:

    Merge将数组或数据行作为参数。

    您是否尝试过对合并进行批处理,即执行以下操作?

    dataSet1.Merge(lines.Select(line=>ImportRow(line)).ToArray());
    

    但是,很可能您无法提高性能—也许您可以在第一时间以某种方式避免合并的需要—例如,按照Sklivz的建议,在DB中进行合并。

        2
  •  0
  •   Sklivvz    17 年前

    您应该尝试使用行循环。如果要合并的表已排序,则这将非常有效。

    http://en.wikipedia.org/wiki/Merge_algorithm

        3
  •  0
  •   Noon Silk    17 年前

    为什么不直接添加行呢?或者按照“Skliwz”的建议在DB中执行?

        4
  •  0
  •   Olivier de Rivoyre    17 年前

    你就不能加上吗 或更新 依赖于行的行是否存在于表中(使用非类型化方法“table.Rows.Find(primaryKeyValues)”)?

    请注意,数据集可能存在许多可伸缩性问题(与DB相比):


    -缺少索引(主键除外)。

        5
  •  0
  •   Skarab    16 年前

    我所知道的最好的合并算法是 Sort-Merge 如果输入数据集按同一属性排序。但我不太清楚C#是否有可能强制ADO对象使用此算法。