2017-07-20 131 views
0

我正在進行遷移,並且當我試圖從SQL Server獲取數據時遇到性能不佳的問題。我這樣做的方式是:使用SQL查詢從SQL Server獲取大量數據的OutOfMemoryException

ctx.ExampleEntity.Database.SQLQuery<ClassConverter>("Select....") 

ClassConverter是具有與ExampleEntity沒有關係的類。問題是,我從該查詢中獲取了超過150萬條記錄,當它嘗試創建列表時,它會拋出OutOfMemoryException,我無法避免這種情況。

這是EF 6.0。

///////////////////////////////////解決方案

繼從抹於了答案,我已經寫了這段代碼,使用1M它不會拋出異常。 sql返回不在最終DB中的記錄。

List<ClassConverter> listRowsToInsert = new List<ClassConverter>(); 
int countRecords=-1; 
int skipCount = 0; 
while(countRecords!=0){ 
    List<ClassConverter> listIndivInsert = genEntitAgp.Database.SqlQuery<ClassConverter>(File.ReadAllText("sql/limitPfm.sql")).Skip(skipCount).Take(1000000).ToList(); 
    countRecords = listIndivInsert.Count(); 
    listRowsToInsert.AddRange(listIndivInsert); 
    if (countRecords < 1000000) 
     countRecords = 0; 
    skipCount += 1000000; 
} 

任何想法?

感謝所有

+0

你真的需要一百萬記錄嗎? – mason

+0

將呼叫分解爲批次? –

+0

如果沒有關係,它可能會返回一個交叉連接,這意味着一個表中的每一行都與第二個表中的每一行相關聯。如果每個表有1000行,則返回1,000,000行。如果您沒有進行任何類型的連接,並且該表只有150萬行,則需要批量執行懶取或獲取,或者更好地進行過濾。 – pmbAustin

回答

0

如果您正在使用EF 6.0你可以映射實體,然後用db.Records.Skip(n).Take(m)處理它們分批?

+0

它的工作原理!我把我的代碼放在這個問題上:) – kartGIS

+1

這個簡單的分頁只有一個缺點 - 如果數據改變,你可以得到重複或丟失的記錄。 –