Array.Copy - >不支持大于2GB的数组

时间:2017-12-15 13:35:37

标签: c# arrays multidimensional-array .net-4.5 gcallowverylargeobjects

我正在使用Array.Copy Method (Array, Array, Int64)。我有以下静态方法

public static T[,] Copy<T>(T[,] a)
    where T : new()
{
    long n1 = a.GetLongLength(0);
    long n2 = a.GetLongLength(1);
    T[,] b = new T[n1, n2];
    System.Array.Copy(a, b, n1 * n2);
    return b;
}

以及以下代码来测试它

double[,] m1 = new double[46340, 46340];
double[,] m2 = Copy(m1); // works

double[,] m3 = new double[46341, 46341];
double[,] m4 = Copy(m3); // Arrays larger than 2GB are not supported
                         // length argument of Array.Copy

我知道<gcAllowVeryLargeObjects enabled="true" />并且我已将其设置为true。

我在Array.Copy Method (Array, Array, Int64)的文档中看到,长度参数有以下注释。

  

64位整数,表示要复制的元素数。整数必须介于0和Int32.MaxValue之间,包括在内。

我无法理解为什么类型为Int64时长度参数会有这个限制?有解决方法吗?是否计划在即将推出的.net版本中删除此限制?

1 个答案:

答案 0 :(得分:2)

解决方法可能是以下代码

public static T[,] Copy<T>(T[,] a)
    where T : new()
{
    long n1 = a.GetLongLength(0);
    long n2 = a.GetLongLength(1);
    long offset = 0;
    long length = n1 * n2;
    long maxlength = Int32.MaxValue;
    T[,] b = new T[n1, n2];
    while (length > maxlength)
    {
        System.Array.Copy(a, offset, b, offset, maxlength);
        offset += maxlength;
        length -= maxlength;
    }
    System.Array.Copy(a, offset, b, offset, length);
    return b;
}

将数组复制为大小为Int32.MaxValue的块。