速度を最適化したい次の(簡略化された)コードがあります。
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についてはあまり気にしません。速度だけです。誰でもこれについてアドバイスできますか?