2016-08-29 23 views
0

我有一個12000數據條目的大集合,例如,並希望通過EF6插入到sqlite數據庫。大部分時間消耗實例化數據模型的加快EF6/sqlite數據庫的模型實例化

此刻我循環12000次「新myItem()」

downloaded12000Items.foreach(result =>{ 
    var myItem= new myItem 
    { 
     Id = result.Id, 
     Description = result.Description, 
     Property1 = result.Property1 
    } 
    resultList.add(myItem); 
}); 

unitOfWork.ItemRepository.InsertRange(resultList); 

我如何可以加快模型的實例或者是有也許另一種更快地將數據插入到sqlite數據庫的方法?

編輯:我必須更好地解釋我的問題。瓶頸不是insert()到數據庫中。要使用EF6 .insert(someModel),您必須創建實體的模型類的實例。我必須這樣做12000次,所有12000個模型類的實例化需要太多時間。

我的問題是,是否有可能通過克隆或其他方式加快模型類的安裝過程?

或者,是否有機會將數據插入sqlite數據庫而不使用.insert(someModel),也許通過使用直接的sql命令或其他東西?顯然,跳過模型實例化可能會有所幫助...

+0

編輯:它不是插入緩慢。它是Model對象的簡單循環安裝。插件本身非常快。 – tronc

+0

您最近的評論與您在最後的陳述中存在矛盾 – MickyD

+0

我認爲這是瓶頸:'unitOfWork.ItemRepository.Insert(myItem);' - 因爲上下文必須跟蹤所有這些12k項目。首先它不需要太多時間,但是在100或1000條記錄之後,它確實如此。 – Maarten

回答

1

瓶頸可能是實體添加到上下文中。

unitOfWork.ItemRepository.Insert(myItem); 

起初它不需要太多時間,但在100或1000條記錄後,它確實。

另請參閱this answer以瞭解您可能能夠添加的其他優化(請閱讀鏈接答案的評論!)。

0

如何加速模型的實例化或者是否有其他方法可以更快地將數據插入sqlite數據庫?

你完成循環並插入「12000數據項」後使用的await Context.SaveChangesAsync()相當於在你的回購協議。 Tell me more

注意它不再需要執行,以提高性能如下:

context.Configuration.AutoDetectChangesEnabled = false; // out of date 
context.Configuration.ValidateOnSaveEnabled = false; // out of date 

...這樣的代碼有其自身的缺點,但更重要的是它是基於出的最新理念並且不利用EF中的await

這裏的生產代碼片段,我用它來保存要求實現矩陣:

// create your objects 
var matrix = // in my prod code I create in excess of 32,600+ matrix cells 
foreach (var cell in cellsToAdd) 
{ 
    matrix.Cells.Add(cell); 
} 

using (var context = new MyDbContext()) 
{ 
    context.Matrices.Add (newMatrix); 

    await context.SaveChangesAsync(); 
} 

我覺得這工作得很好,當我在生產環境中插入32,646基質細胞。只需使用awaitSaveChangesAsync()改進的性能12次。其他策略,如批處理不是有效的和禁用選項,如AutoDetectChangesEnabled雖然有些用處,可以說擊敗了使用ORM的目的。

+0

爲什麼要更快地將數據插入sqlite數據庫? – Maarten

+0

因爲它會傳達一個單一的「sql」語句。否則將提出11000個單一請求。 – AntonR

+0

@Maarten http://stackoverflow.com/a/30043327/585968。根據我的經驗,它使它快12倍 – MickyD