我们在应用程序中使用强类型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中,并且在数据库中执行也不是一个选项,因为我们的导入逻辑非常复杂。
答案 0 :(得分:2)
你可能已经尝试过了,但以防万一:
DataSet.Merge将数组或DataRows作为参数。
您是否尝试过对合并进行批处理,即执行以下操作?
dataSet1.Merge(lines.Select(line=>ImportRow(line)).ToArray());
然而,很有可能你无法提高性能 - 也许你可以在某种程度上避免首先进行合并 - 例如在数据库中进行合并,正如Sklivvz建议的那样。
答案 1 :(得分:0)
显而易见的答案是“在数据库中执行” - 我认为它不适用于您的情况。
您应该尝试使用行循环。如果要合并的表已排序,这可能非常有效。
答案 2 :(得分:0)
为什么不直接添加行?或者像“Skliwz”建议的那样在数据库中做到这一点?
答案 3 :(得分:0)
你不能只是添加或更新行,这取决于行是否存在于表中(使用非类型化方法“table.Rows.Find(primaryKeyValues)”)?
请注意,DataSet可能存在很多可伸缩性问题(与数据库相比):
- 没有交易=>没有concurreny
- 从xml缓慢加载(可能是DB更快/线性)
- 缺少索引(主键除外)
- 不要作为DB缓存,它可能是ram受限系统中的问题(在32b系统中)。
答案 4 :(得分:0)
如果输入数据集按相同属性排序,我知道的最佳合并算法是Sort-Merge。但我不清楚C#是否可以强制ADO对象使用这种算法。