c# - C#中的ArrayPool创建方法
问题描述
我在 C# 中与 ArrayPool 一起使用。我想创建自己的池,最大数组数量为 5,最大数组大小为 1050000。我使用了这个 ArrayPool.Create() 方法。我无法理解一件事-我试图在下面的代码段中从池中租用 10 次,尽管我将最大数组指定为 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 的幂和其他一些逻辑来确定的。
推荐阅读
- typescript - 带有部分类型注释的 TypeScript 函数参数解构
- jupyter-notebook - IBM Watson Studio 中 Jupyter Notebook 中的超链接 - 拒绝连接
- vuepress - 在布局中包含自定义手写笔文件(Vuepress 1.x)
- java - java - 如何在java中只使用某些类对象值?
- jquery - 通过 jquery 的后台 css 更新没有发生
- javascript - 如何使用 queryselector 来验证是否填写了两个输入字段?
- python - 如何使用熊猫将 logReturns 转移回原始价格?
- c# - 用新值更新列中的每条记录
- wordpress - 网站问题 - 从本地主机移动到虚拟机
- gradle - Gradle >=4.6:在多模块构建中同时使用 java-library 和 java 插件