繁体   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