5

我有以下(简化的)代码,我想优化它们的速度:

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,只关心速度。任何人都可以对此提出一些建议吗?

4

3 回答 3

13

对于这么大的桌子,您应该改用

public void WriteToServer(IDataReader reader)

方法。

这可能意味着您必须IDataReader用您的代码实现自己的“假”接口(如果您没有从现有的IDataReader.将避免2亿循环。

于 2011-02-01T08:10:30.730 回答
4

我建议不要在内存中保存一个巨大的数据表,而是实现一个IDataReader在批量复制时提供数据的服务。这将减少将所有内容预先保存在内存中的需要,因此应该有助于提高性能。

于 2011-02-01T08:11:53.980 回答
0

您不应该在内存中构建整个数据表。使用这个WrtieToServer重载,它需要 DataRow 数组。只需将您的数据分成几块。

于 2011-02-01T08:09:27.813 回答