3

Ich verwende die Array.Copy Method (Array, Array, Int64). Ich habe die folgende statische MethodeArray.Copy -> Arrays größer als 2GB werden nicht unterstützt

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; 
} 

und den folgenden Code es ist mir bewusst <gcAllowVeryLargeObjects enabled="true" />

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 

zu testen, und ich habe es auf true gesetzt.

Ich sah in der Dokumentation von Array.Copy Method (Array, Array, Int64), dass es die folgende Bemerkung für das Längenargument gibt.

Eine 64-Bit-Ganzzahl, die die Anzahl der zu kopierenden Elemente angibt. Die ganze Zahl muss zwischen 0 und Int32.MaxValue (einschließlich) liegen.

Ich kann nicht verstehen, warum gibt es dieses Limit für die Länge Argument, wenn der Typ Int64 ist? Gibt es eine Problemumgehung? Ist es geplant, dieses Limit in einer kommenden Version von .net zu entfernen?

Antwort

2

Eine Abhilfe könnte den folgenden Code

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; 
} 

sein, wo das Array in Blöcke der Größe Int32.MaxValue kopiert wird.

+0

@AdamHouldsworth Ich habe mit Doppel (Größe ist 8) getestet und es sieht aus wie es funktioniert, auch wenn ein Array-Block etwa 16 GB ist. – Wollmich

+0

@AdamHouldsworth, aber OP verwendet 'gcAllowVeryLargeObjects', daher gibt es keine Beschränkung auf 2 GB. – Evk

+0

@wollmich Entschuldigung Ich sehe, es gibt kein Problem mit der Array-Größe, nur scheint es eine künstliche Begrenzung in der aktuellen 'Copy'-Implementierung zu sein. –

Verwandte Themen