ArrayPool 创建方法在 C# 中给出错误

ArrayPool create method giving error in C#

基本上,我想使用 ConcurrentAppend API.

将数据从源文件并行读取到 Azure 数据湖中的目标文件

此外,我不想一次从文件中读取所有数据,而是以块的形式读取数据,为此我使用了缓冲区。我想创建 5 个 1 MB 的缓冲区、5 个 2 MB 的缓冲区和 5 个 4 Mb 的缓冲区。每当源文件到达时,它将根据其大小使用适当的缓冲区,我将使用该缓冲区附加到目标。我不希望缓冲区在每个 case/configuration.

中超过 5 个

我正在使用共享 ArrayPool 来租用缓冲区。但是由于我有这样的条件,即在每种情况下分配不应超过 5 个数组(1、2 和 4 MB)-> 我不得不使用一些条件来限制它。

我更愿意使用我可以创建的自定义池:

ArrayPool<byte> pool = ArrayPool<byte>.Create( One_mb , 5)

这将确保我的分配不会超过 5 个数组,并且数组的最大大小为 1 MB。同样,我可以为 2 和 4 MB 的情况再创建两个缓冲池。这样我就不需要将这些条件限制为 5 了。

问题:

当我使用此自定义池时,我的目标文件中的数据已损坏。此外,目标文件大小增加了一倍,就像输入总和为 10 mb -> 目标文件显示 20 mb 一样。

如果我使用相同的代码并从单个共享 ArrayPool 而不是这些自定义池租用,我会得到正确的结果。

我做错了什么?

我的代码: https://github.com/ChahatKumar/ADLS/blob/master/CreatePool/Program.cs

FileStream.Read returns 读取的字节数。这不一定是您的数组的大小,并且很可能更小(如果没有读取字节,则为零)。 github 示例中的代码忽略了 Read 的值,并通过告诉下一个方法使用整个缓冲区来错误地假设缓冲区已被填充。因为你的数组太大了,所以有可能(而且很可能)你不会通过一次调用 Read 来完全读取它们(即使文件实际上那么大,FileStream 有自己的内部缓冲区和缓冲区尺寸)。

您的方法可能如下所示。请注意,我将读取的实际字节数传递给 ConcurrentAppend(我认为它符合长度参数):

int read;
while ((read = file.Read(buffer1, 0, buffer1.Length) > 0)
{
   c.ConcurrentAppend(filename, true, buffer1, 0, read);
}