我正在通過EF4將文本文件讀入數據庫。這個文件有超過600,000行,因此速度很重要。如何找出EF4中SaveChanges的最佳尺寸?
如果我在創建每個新的實體對象後調用SaveChanges,那麼這個過程大約需要15分鐘。 如果我在創建1024個對象後調用SaveChanges,那麼它會下降到4分鐘。
1024是我挑選的任意數字,它沒有參考點。
但是,我想知道在調用SaveChanges之前是否有最佳數量的對象加載到我的實體集中? 如果是這樣......你如何解決(除了試驗和錯誤)?
我正在通過EF4將文本文件讀入數據庫。這個文件有超過600,000行,因此速度很重要。如何找出EF4中SaveChanges的最佳尺寸?
如果我在創建每個新的實體對象後調用SaveChanges,那麼這個過程大約需要15分鐘。 如果我在創建1024個對象後調用SaveChanges,那麼它會下降到4分鐘。
1024是我挑選的任意數字,它沒有參考點。
但是,我想知道在調用SaveChanges之前是否有最佳數量的對象加載到我的實體集中? 如果是這樣......你如何解決(除了試驗和錯誤)?
這實際上是一個非常有趣的問題,當環境變得非常大時,EF變得非常慢。實際上,您可以通過在批量插入期間禁用AutoDetectChanges來對抗這一點並大幅提高性能。但是,通常情況下,您可以在SQL中的事務中包含的項目越多越好。
看看我的崗位上表現EF這裏http://blog.staticvoid.co.nz/2012/03/entity-framework-comparative.html,和我的職位上如何禁用AutoDetectChanges改善這種這裏http://blog.staticvoid.co.nz/2012/05/entityframework-performance-and.html,這些也會給你的批量大小如何影響性能的一個好主意。
描述該應用程序,看看你選擇的兩個時間有什麼花費。這應該可以讓你從一些好的數據中推斷出來。
就我個人而言,我不得不質疑爲什麼你使用EF來加載文本文件 - 對於那些應該很容易使用BCP或直接SQLCommands觸發數據庫的東西來說,這看起來像是過度殺傷力。
如果您不使用實體框架,則可以更快地完成此操作。嘗試SqlBulkCopy:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx – ZippyV
我還對數據執行了一些轉換和計算。我想到了2的階段,並做了一個SQLBulkInsert,然後是.Net服務 - 但是這增加了額外的複雜性和依賴性。它鏈接到FileSystemWatcher和另外兩個文件依賴項。 – BlueChippy