Оптимизация C #: вставка 200 миллионов строк в базу данных

У меня есть следующий (упрощенный) код, который я хотел бы оптимизировать для повышения скорости:

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, только скорость. Может ли кто-нибудь дать совет по этому поводу?

5
задан David Tang 1 February 2011 в 08:09
поделиться