使用Linq到sql从csv批量插入到DB

时间:2011-05-06 22:19:43

标签: .net linq-to-sql bulkinsert

我已经实现了一个从csv文件获取数据并插入Sql DB的应用程序,我正在使用Linq来实现sql。我还要求扫描那些正在进行验证的记录, 为了实现这一点,我使用了一个循环并在循环内部调用了commitchnages()。

问题:这个应用程序正在处理较少数量的记录(< 100),但实际上不能获得更多3-4个记录的csv文件。我只是简单地针对这些大文件运行我的应用程序,结果该应用程序需要很长时间(5 -6小时)。

请建议任何更好的方法。

3 个答案:

答案 0 :(得分:3)

Linq-to-SQL非常适合从数据库中获取数据,或者用于验证以及一次性的少量插入/更新。但是对于你正在做的事情(ETL),听起来你需要调查SqlBulkCopy对象。继续使用你的L2S对象进行验证,但是然后不是提交更改,而是将对象映射到一个好的旧式ADO.NET DataTable中,每1000个记录左右,批量插入它们。

答案 1 :(得分:1)

如果性能是一个大问题,LINQ to SQL可能不适合这项工作。但是,在将LINQ to SQL抛出解决方案的大门之前,您可能会考虑以下因素:

  • 尝试在一定数量的记录后创建新的DataContextDataContext缓存所有实体,以便发送到数据库并从数据库中检索,这将导致大量内存占用并最终导致内存不足。
  • 使用SQL事件探查器查看LINQ to SQL向数据库发送的查询。可能,LINQ to SQL还会为您创建的每个实体查询数据库。
  • 尝试在插入时调整数据库。这可能很困难,但您可以尝试将这些记录写入中间表(具有较少的依赖性)并使用存储过程将数据移动到其最终目标。

批量插入是O / RM不擅长的东西,因此您可能需要采用不同的方法。

答案 2 :(得分:1)

如果必须使用Linq2Sql进行插入,则可能需要进行间歇性提交。像这样的东西 -

    public void LoadLargeDataUsingLinqToSql(string pathToCSV){
        DataTable dt = LoadMyCSVToDataTable(pathToCSV);
        int myPerformanceCounter = 0;
        foreach(DataRow dr in dt.Rows()){
            MyLinqClass m = ConvertDRToMyLinqClass(dr);
            if(m.IsValidAndReadyToBeSaved()){
                MyDataContext.MyLinqClassRef.InsertOnSubmit(m);
                myPerformanceCounter++;
            }

            if(myPerformaceCounter>25000){
                //Commit to clear cache.
                MyDataContext.SubmitChanges();
                myPerformanceCounter=0;
            }
        }
        //Commit leftovers
        MyDataContext.SubmitChanges();
    }