Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#优化:在数据库中插入2亿行_C#_Datatable_Sqlbulkcopy - Fatal编程技术网

C#优化:在数据库中插入2亿行

C#优化:在数据库中插入2亿行,c#,datatable,sqlbulkcopy,C#,Datatable,Sqlbulkcopy,我有以下(简化)代码,我想对其进行速度优化: long inputLen = 50000000; // 50 million DataTable dataTable = new DataTable(); DataRow dataRow; object[] objectRow; while (inputLen--) { objectRow[0] = ... objectRow[1] = ... objectRow[2] = ... // Generate out

我有以下(简化)代码,我想对其进行速度优化:

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();
long inputLen=50000000;//5000万
DataTable=新的DataTable();
数据行数据行;
对象[]对象行;
while(输入--)
{
objectRow[0]=。。。
objectRow[1]=。。。
objectRow[2]=。。。
//为此输入生成输出
输出=。。。
对于(int i=0;i
我已经在尝试使用SQLBulkCopy来加快速度,但是给DataTable本身赋值似乎很慢

我不知道DataTables是如何工作的,所以我想知道,首先创建一个可重用的数组,然后将其分配给DataRow,然后将DataRow添加到DataTable,是否会产生不必要的开销?还是说使用DataTable一开始就不是最优的?输入来自数据库


我不太在乎LOC,只在乎速度。有人能给点建议吗?

您不应该在内存中构建整个数据表。使用WrtieToServer的这个函数,它接受DataRow数组。只需将数据分块。

对于如此大的表,您应该使用

public void WriteToServer(IDataReader reader)
方法


这可能意味着你必须用你的代码实现一个“假”的
IDataReader
接口(如果你没有从现有的
IDataReader
中获取数据),但这样,你将从端到端实现“流”,并将避免2亿次循环。

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

该方法是否仍在内存中构建它?此外,如果我没有耗尽内存,在内存中构造它不是最快的吗?如果一次只构造1k行而不是200m行,那么内存管理器保存如此多的数据会容易得多。除此之外,几乎可以肯定的是,您可以一次交换内存中保存的2亿条记录,这是否意味着SQLBulkCopy在构建行时仍然可以高效地写入数据库?输入来自同一个数据库,但对于每一行,我可能会创建20000个新的。@Box9:是的,在调用SQLBulkCopy之前,数据不需要在那里。我们在这里有一个“遗留数据接管”应用程序,它将在大约一小时内移植一百万行(BCP输出一个表,格式化几个BCP文件,BCP输入这些文件)。我们最近需要它在大约4400万行上运行,我实现了几个IDataReader,从源数据库读取数据,并按照SQLBulkCopy的要求格式化行,从而将1小时缩短到10分钟。例如,请看
SimpleDataReader