更快(更具伸缩性)的DataSet.Merge?

时间:2009-08-12 09:05:57

标签: c# ado.net

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

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

不幸的是,这不会扩展。对于较大的进口,合并占我们总进口时间的80%(根据我们的分析器)。

有更快的方法吗?

编辑:我们不能只添加行,因为它们可能已经在DataSet中,并且在数据库中执行也不是一个选项,因为我们的导入逻辑非常复杂。

5 个答案:

答案 0 :(得分:2)

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

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

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

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

然而,很有可能你无法提高性能 - 也许你可以在某种程度上避免首先进行合并 - 例如在数据库中进行合并,正如Sklivvz建议的那样。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

为什么不直接添加行?或者像“Skliwz”建议的那样在数据库中做到这一点?

答案 3 :(得分:0)

你不能只是添加或更新行,这取决于行是否存在于表中(使用非类型化方法“table.Rows.Find(primaryKeyValues)”)?

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

答案 4 :(得分:0)

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