繁体   English   中英

我可以用Linq-to-SQL做一个非常大的插入吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM