2015-09-19 47 views
1

我寫了一個課程來讀取一個CSV文件,其中包含4k條記錄,72個寬的寬度。在列表中的'read()'需要從字面上第二個,也許...性能調優:保存記錄按指數規律增長每500個記錄?

一旦我已成功加載列表,我有一般流程保存每個對象到數據庫;

foreach (var object in Objects) 
{ 

    try{ 
     // check conditions 
     // perform conversions on the data and assign to domain object.property 
     //.... 
     //db.object.Add(object); 
     //db.savechanges(); 

    }catch{ 

     //update log if the try fails 
    } 
} 

一旦循環成功執行,我調用db.dispose();

我沒有在MVC控制器結構之外構建太多的類,因爲我是新手,所以對我來說很簡單;)。我假設我正在使用這種造成指數處理時間問題的方法來捆綁寶貴的資源。

有關如何提高性能的任何建議?提前致謝!

+0

由於這是實體框架,我猜你會遇到大量對象變化跟蹤的開銷。有各種方法來解決這個問題。谷歌的「實體框架更改跟蹤」,也許有一些背景爲「AutoDetectChangesEnabled」。 –

+0

謝謝,我將不得不考慮這一點。我的一般邏輯是從列表中取一個對象並將其分配給一個域對象,保存,清洗重複。我不確定爲什麼它會跟蹤更改,因爲這些都是新對象。對於那些我檢查它們是否已經存在的對象,我運行db.model.find(),然後將列表對象中的每個值分配給「找到的」域對象。 – JReam

+0

這是你引用Atoms的嗎? http://weblog.west-wind.com/posts/2013/Dec/22/Entity-Framework-and-slow-bulk-INSERTs – JReam

回答

1

如果您正在使用SQL Server並且願意使用Entity-framework之外的某些功能,那麼可能會對您非常有用的批量複製例程。基本上你要做的是在內存中創建一個表格(它是一個.net對象),然後添加你的記錄。一旦將所有72K記錄添加到表格中,那麼您將立即將其保存到數據庫中。由於這使用了針對此場景調整的大容量複製功能,因此其速度非常快。

這裏有一對夫婦的文章,可能讓你開始:

http://www.codeproject.com/Articles/16922/SQL-Bulk-Copy-with-C-Net

http://www.codeproject.com/Articles/18418/Transferring-Data-Using-SqlBulkCopy

http://dotnetmentors.com/c-sharp/bulk-upload-into-sql-server-using-sqlbulkcopy-and-c-sharp.aspx

+0

我很感激!它將是一個例行的事情來抓取文件並將其處理到這個系統中。我可能會堅持使用EF並嘗試寫出一個更好的方法......但是,我們將考慮您對數據遷移的建議,謝謝。 – JReam