簡體   English   中英

C#中的ArrayPool創建方法

[英]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];

因此,這兩個參數( maxArrayLengthmaxArraysPerBucket )僅用於控制ArrayPool將實際存儲和重用的內容,而不是可以分配多少(這是有道理的,通常您不希望您的應用程序在分配 memory 時失敗,如果有足夠的memory 可用)。 其他一切都將由GC控制,因此ArrayPool最終不會存儲大量不可收集的 memory。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM