我已经实现了一个从csv文件获取数据并插入Sql DB的应用程序,我正在使用Linq来实现sql。我还要求扫描那些正在进行验证的记录, 为了实现这一点,我使用了一个循环并在循环内部调用了commitchnages()。
问题:这个应用程序正在处理较少数量的记录(< 100),但实际上不能获得更多3-4个记录的csv文件。我只是简单地针对这些大文件运行我的应用程序,结果该应用程序需要很长时间(5 -6小时)。
请建议任何更好的方法。
答案 0 :(得分:3)
Linq-to-SQL非常适合从数据库中获取数据,或者用于验证以及一次性的少量插入/更新。但是对于你正在做的事情(ETL),听起来你需要调查SqlBulkCopy
对象。继续使用你的L2S对象进行验证,但是然后不是提交更改,而是将对象映射到一个好的旧式ADO.NET DataTable中,每1000个记录左右,批量插入它们。
答案 1 :(得分:1)
如果性能是一个大问题,LINQ to SQL可能不适合这项工作。但是,在将LINQ to SQL抛出解决方案的大门之前,您可能会考虑以下因素:
DataContext
。 DataContext
缓存所有实体,以便发送到数据库并从数据库中检索,这将导致大量内存占用并最终导致内存不足。批量插入是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();
}