6

我正在處理一個批處理過程,它將緩慢的遺留數據庫(每個記錄獲取時間1.4-2ms)累積到800,000條記錄到MySQL中執行更快一點。爲了優化這一點,我一直在將所有的MySQL記錄加載到內存中,使用量大約爲200MB。然後,我開始從遺留數據庫轉儲並更新記錄。實體框架從上下文中刪除對象,但不是從數據庫中刪除對象

最初,當這將完成更新記錄時,我會調用SaveContext,然後使我的內存從500MB-800MB跳到1.5GB。很快,我就會發現內存異常(運行的虛擬機有2GB內存),即使我給它更多的內存,1.5-2GB仍然有點過分,並且只會將一個帶 - 幫助解決問題。爲了解決這個問題,我開始每調用一次10,000條記錄就調用SaveContext,因爲我使用委託來從舊數據庫中獲取數據並在MySQL中更新它,但是從性能方面來說, 5秒鐘左右,等待它保存它,然後運行內存中的更新,爲已備份的3000條記錄進行更新。但是,內存使用量仍然在不斷增加。

這裏是我的潛在問題:

  • 的數據出來,在任何順序遺留數據庫的,所以我不能塊的更新和定期發佈的ObjectContext。
  • 如果我沒有事先獲取MySQL中的所有數據,而是在更新過程中通過記錄查找它,它非常慢。我反而把它全部抓住,將它轉換爲由主鍵索引的字典,當我更新數據時,我從字典中刪除記錄。

一個可能的解決方案,我認爲是以某種方式釋放正在使用的,我知道,因爲他們已經被更新我再也不會去碰實體內存(比如清除緩存,但只針對特定項目),但我不知道Entity Framework是否可能。

有沒有人有任何想法?

+1

EF似乎不適合這份工作。你爲什麼不直接遷移數據? – Pawel

+0

使用SSIS遷移數據 – fenix2222

回答

2

我想知道,如果你最好的賭注是不是正如上面所提到的另一種工具或只是放棄使用實體框架。如果你不是做代碼沒有ORM,您可以:

  1. 調整SQL語句來提高性能
  2. 輕鬆控制和改變,交易的範圍,以獲得最佳的性能。
  3. 您可以對更新進行批處理,以便您不調用服務器來完成多個更新,而不是一次執行一個更新。