我正在進行遷移,並且當我試圖從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;
}
任何想法?
感謝所有
你真的需要一百萬記錄嗎? – mason
將呼叫分解爲批次? –
如果沒有關係,它可能會返回一個交叉連接,這意味着一個表中的每一行都與第二個表中的每一行相關聯。如果每個表有1000行,則返回1,000,000行。如果您沒有進行任何類型的連接,並且該表只有150萬行,則需要批量執行懶取或獲取,或者更好地進行過濾。 – pmbAustin