[英]Can I do a very large insert with Linq-to-SQL?
我有一些文本数据,我使用这种方法使用Linq-to-SQL加载到SQL Server 2005数据库中(伪造代码):
Create a DataContext
While (new data exists)
{
Read a record from the text file
Create a new Record
Populate the record
dataContext.InsertOnSubmit(record);
}
dataContext.SubmitChanges();
代码是一个小C#控制台应用程序。 到目前为止这个工作正常,但我要导入真实数据(而不是测试子集),这包含大约200万行而不是我测试过的1000行。 我是否必须做一些聪明的批处理或类似的事情,以避免代码崩溃或表现糟糕,或者Linq-to-SQL应该优雅地处理这个问题?
看起来这样可行但是DataContext保留的更改(以及因此内存)将随着每个InsertOnSubmit而增长。 也许建议每100条记录执行一次SubmitChanges?
我还要看一下SqlBulkCopy ,看看它是否更适合你的用例。
如果您需要进行批量插入,您应该检查SqlBulkCopy
Linq-to-SQL并不适合进行大规模批量插入。
您可能希望每1000条记录调用SubmitChanges(),以便刷新更改,否则您将耗尽内存。
如果您想要性能,可能需要绕过Linq-To-SQL并转而使用System.Data.SqlClient.SqlBulkCopy。
只是为了记录,我做了marc_s和彼得建议并将数据分块。 它不是特别快(调试配置需要大约一个半小时,附带调试器和很多控制台进度输出),但它完全满足我们的需求:
Create a DataContext
numRows = 0;
While (new data exists)
{
Read a record from the text file
Create a new Record
Populate the record
dataContext.InsertOnSubmit(record)
// Submit the changes in thousand row batches
if (numRows % 1000 == 999)
dataContext.SubmitChanges()
numRows++
}
dataContext.SubmitChanges()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.