[英]ArrayPool create method in C#
我在 C# 中使用了 ArrayPool。 我想創建自己的池,最大數量為 arrays 5,最大數組大小為 1050000。我使用了這個 ArrayPool.Create() 方法。 我無法理解一件事 - 我試圖在下面的代碼段中從池中租用 10 次,盡管我將 max arrays 指定為 5,但為什么它沒有顯示任何錯誤。 另外,我將最大長度指定為 1050000。那么我如何才能租用 4200000 數組而不會出現任何錯誤?
byte[] buffer;
ArrayPool<byte> pool = ArrayPool<byte>.Create(1050000, 5);
for (int i = 0; i < 10; i++)
{
buffer = pool.Rent(4200000);
}
傳遞給ArrayPool.Create
的選項並不意味着您不能接收大於這些限制的數組。 相反,它們用於控制ConfigurableArrayPool
的分桶算法。 第二個參數是存儲桶中的最大槽數,第一個參數是任何數組的最大大小。 該值由1,048,576
的內部常量限制,該常量已經小於您的1,050,000
。
當您從陣列池中Rent
時,算法將嘗試在其中一個存儲桶/插槽中定位陣列。 這些存儲桶(及其內部插槽)的數量受到您傳入的值的限制。如果池沒有請求的最小大小的數組,要么因為所有插槽都在使用中,要么因為請求的大小更大超過最大值,它將改為分配一個新的(不合並它)並返回它。
簡而言之,當您請求的數組大於您傳遞給Create
方法的(上限)大小時,您將產生分配並接收一個不參與池的數組。 使用此數組調用Return
不會將其放回池中; 相反,它將被“丟棄” 。
但請記住,這些規則僅適用於內置數組池。 您(或其他人)可以編寫一個限制返回數組大小甚至拋出的實現——盡管我認為這些可能不被認為是表現良好的(至少在沒有支持文檔的情況下)。
根據您的評論更新:
雖然 true 沒有直接對應於桶數的參數,但有間接對應的參數。 桶的數量是使用您傳入的最大數組大小來計算的。 最大桶是根據 2 的冪和其他一些邏輯來確定的。
文檔沒有為Rent
方法定義異常(盡管至少有一個可以拋出 - ArgumentOutOfRangeException
用於負數組大小)。
查看Create
方法的源代碼- 它返回ConfigurableArrayPool
。 它的Rent
方法會嘗試為請求找到一個匹配的數組,如果沒有合適的數組,它將分配一個新的:
// The request was for a size too large for the pool. Allocate an array of exactly the requested length.
// When it's returned to the pool, we'll simply throw it away.
buffer = new T[minimumLength];
因此,這兩個參數( maxArrayLength
和maxArraysPerBucket
)僅用於控制ArrayPool
將實際存儲和重用的內容,而不是可以分配多少(這是有道理的,通常您不希望您的應用程序在分配 memory 時失敗,如果有足夠的memory 可用)。 其他一切都將由GC
控制,因此ArrayPool
最終不會存儲大量不可收集的 memory。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.