【问题标题】:Faster (more scalable) DataSet.Merge?更快(更可扩展)的 DataSet.Merge?
【发布时间】:2010-11-18 21:36:49
【问题描述】:

我们在应用程序中使用强类型数据集。导入数据时,我们使用方便的 DataSet.Merge() 操作将 DataRows 从一个 DataSet 复制到另一个。

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

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

有更快的方法吗?

编辑:我们不能只添加行,因为它们可能已经在 DataSet 中,并且在数据库中也不能这样做,因为我们的导入逻辑非常复杂。 p>

【问题讨论】:

    标签: c# ado.net


    【解决方案1】:

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

    DataSet.Merge 将数组或 DataRows 作为参数。

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

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

    但是,您很可能无法提高性能 - 也许您可以首先以某种方式避免需要合并 - 例如通过在数据库中进行合并,正如 Sklivvz 建议的那样。

    【讨论】:

    • 我的测试表明批处理会有所帮助,但在我们的应用程序中实现它并非易事......
    • 在这种情况下,您可能无法提高 Merge 性能 - 这是一个众所周知的问题,您最希望的就是通过其他一些(自定义、自写)实现类似的功能意思是。
    【解决方案2】:

    显而易见的答案是“在数据库中执行”——我假设它不适用于您的情况。

    您应该尝试使用行循环。如果要合并的表已排序,这可能会非常高效。

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

    【讨论】:

      【解决方案3】:

      为什么不只添加行?还是按照“Skliwz”的建议在数据库中执行?

      【讨论】:

        【解决方案4】:

        您不能根据表中是否存在行来添加或更新行(使用未键入的方法“table.Rows.Find(primaryKeyValues)”)吗?

        请注意,DataSet 可能存在很多可伸缩性问题(与 DB 相比):
        - 没有交易 => 没有并发。
        - 从 xml 加载缓慢(也许从 DB 加载更快/线性)。
        - 缺少索引(主键除外)。
        - 不要缓存为数据库,这可能是内存受限系统(在 32b 系统中)的问题。

        【讨论】:

          【解决方案5】:

          如果您的输入数据集按相同的属性排序,我所知道的最佳合并算法是 Sort-Merge。但是我对 C# 的了解不是很深,说是否可以强制 ADO 对象使用这种算法。

          【讨论】:

            猜你喜欢
            • 2011-03-26
            • 2021-04-12
            • 2013-08-31
            • 1970-01-01
            • 1970-01-01
            • 2014-10-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多