我有下面的(简化的)代码,我想优化它的速度:
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分配值本身就很慢。
我不知道DataTable的工作原理,所以我想知道是否先创建可重用数组,然后将其分配给DataRow,再将DataRow添加到DataTable中会产生不必要的开销?或者首先使用DataTable不是最优的选择吗?输入来自数据库。
我不太关心代码行数,只关心速度。有人可以给出一些建议吗?
SimpleDataReader
链接。 - Marc Gravell