我有以下(简化的)代码,我想优化速度:
long inputLen = 50000000; // 50 million
DataTable dataTable = new DataTable();
DataRow dataRow;
object[] objectRow;
while (inputLen--)
{
objectRow[0] = ...
objectRow[1] = ...
objectRow[2] = ...
// Generate output for this input
output = ...
for (int i = 0; i < outputLen; i++) // outputLen can range from 1 to 20,000
{
objectRow[3] = output[i];
dataRow = dataTable.NewRow();
dataRow.ItemArray = objectRow;
dataTable.Rows.Add(dataRow);
}
}
// Bulk copy
SqlBulkCopy bulkTask = new SqlBulkCopy(connection, SqlBulkCopyOptions.TableLock, null);
bulkTask.DestinationTableName = "newTable";
bulkTask.BatchSize = dataTable.Rows.Count;
bulkTask.WriteToServer(dataTable);
bulkTask.Close();
我已经在使用 SQLBulkCopy 来尝试加快速度,但似乎向 DataTable 本身分配值的速度很慢。
我不知道 DataTables 是如何工作的,所以我想知道我是否通过首先创建一个可重用数组,然后将其分配给 DataRow,然后将 DataRow 添加到 DataTable 来创建不必要的开销?或者使用 DataTable 一开始就不是最佳选择?输入来自数据库。
我不太关心LOC,只关心速度。有人可以就此提供一些建议吗?
对于这么大的表,您应该使用
public void WriteToServer(IDataReader reader)
method.
这可能意味着你必须自己实现一个“假”IDataReader
与您的代码交互(如果您没有从现有的代码中获取数据)IDataReader
),但这样,您将获得从一端到另一端的“流式传输”,并且将避免 2 亿次循环。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)