大多數人都知道 ToList()、ToArray() 使用大量記憶體,因為它們在 N 個元素之后重新創建陣列。我需要從表中獲取所有行,我這樣寫
ToArray(_dbContext.MyTable.Count(), _dbContext.MyTable.Select(x => ...})
T[] ToArray<T>(int arraySize, IEnumerable<T> list)
{
var result = new T[arraySize];
byte tempIndex = 0;
foreach (var item in list)
{
result[tempIndex] = item;
tempIndex ;
}
return result;
}
此代碼使用的記憶體比簡單代碼少 10%
_dbContext.MyTable.Select(x => ...}).ToList() \ ToArray()
EF 是否有與我的代碼類似的內容?
uj5u.com熱心網友回復:
您使用的記憶體較少,但可以肯定的是,如果表很大和/或您的資料庫不是本地的,則此操作將需要更多時間運行。
您正在資料庫中執行兩個查詢,例如:
-
select count(*) from MyTable -
select * from MyTable
EF 使用單個查詢來實作相同的功能。我認為 10% 的記憶體是為更好的性能付出的很小的代價。因此,EF 沒有這種行為。
uj5u.com熱心網友回復:
EF 沒有這個,但所提出的方法也不是一個好的解決方案。
建議的解決方案并不好,因為它在資料庫上運行兩個查詢,并且額外的資料庫呼叫往往會超過額外的 RAM 使用。但是假設您知道結果的大小(可能是因為分頁)并且可以跳過額外的資料庫查詢。即使這樣,這仍然比它需要的要慢。
相反,優化這一點的方法是首先認識到在大多數情況下都不需要ToArray()或不需要。ToList()學習直接使用生成IEnumerable的 , IQueryable,IAsyncEnumerable等。您已經可以將它們用于資料系結或foreach回圈創建所需的任何結果;很少有真正需要打電話ToArray()的。
大多數時候,您似乎需要ToList()or ToArray(),這是因為您正在呼叫一個要求該型別引數的方法。這些方法也應該更新為請求IEnumerableor IAsyncEnumerable。如果你能把它一路向下推,你的代碼的記憶體效率可以顯著提高,因為完整的結果集永遠不會加載到記憶體中;您一次只能在記憶體中保存一個記錄。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/426633.html
