27 Stimmen

Die Begrenzung der Größe von .Net-Arrays

Ich habe gehört, dass es eine feste Grenze für die Größe von .Net Array . Es wird gesagt, dass die maximale Menge an Speicher, die einer einzelnen Instanz eines Programms zugewiesen werden kann Array Objekt ( unabhängig davon, ob es sich um int[] , double[] oder Ihr eigenes Array) beträgt 2 GB. Und nein, wenn Sie einen 64-Bit-Rechner haben, ist die 2-GB-Grenze immer noch vorhanden.

Ich bin mir nicht sicher, ob mein Eindruck richtig ist oder nicht. Kann das jemand bestätigen?

0 Stimmen

Wow, Sie haben eine interessante Diskussion angestoßen.

0 Stimmen

Falls es Sie beruhigt: Die 2-GB-Grenze gilt auch für nicht verwalteten Code. Dies ist eine Einschränkung im x64-Befehlssatz, indizierte Offset-Adressierung hat immer noch eine 32-Bit-Grenze für den Offset. Es ist nicht so, dass es nicht überwunden werden kann, es ist nur sehr ineffizient, dies zu tun.

1 Stimmen

Hans Passant: Ich verwende C++ unmanaged Code in meinem x64 app, um ein Array von 600E6 Doubles mit malloc zuzuweisen. Das sind 4,8E9 Bytes.

24voto

Marc Gravell Punkte 970173

In Versionen von .NET vor 4.5 beträgt die maximale Objektgröße 2 GB. Ab 4.5 können Sie größere Objekte zuweisen, wenn gcAllowVeryLargeObjects aktiviert ist. Beachten Sie, dass der Grenzwert für string ist nicht betroffen, aber "Arrays" sollte auch "Listen" abdecken, da Listen durch Arrays unterstützt werden.

0 Stimmen

Danke @Mark Gravell. Wir haben uns daran erinnert, dass es so etwas gibt, aber vergessen, wie es heißt.

15voto

Brian Rasmussen Punkte 112118

Das ist richtig. Kein einzelnes Objekt kann größer als 2 GB sein. .

Wie bei 32-Bit-Windows-Betriebssystemen Systemen gibt es eine 2-GB-Grenze für die Größe eines Objekts, das Sie erstellen können, während eine verwaltete 64-Bit-Anwendung ausführen auf einem 64-Bit-Windows-Betriebssystem ausführen.

Diese Frage enthält weitere Einzelheiten und einige nützliche Links: Sind einzelne Objekte in CLR 4.0 immer noch auf eine Größe von 2 GB begrenzt?

1 Stimmen

Gibt es auch eine Begrenzung für die Anzahl der Elemente im Array?

1 Stimmen

@uriDium: effektiv ja, da ein Array ein Objekt ist.

0 Stimmen

Diese Frage enthält zusätzliche Informationen über die Größe von Arrays in .NET stackoverflow.com/questions/1589669/overhead-of-a-net-array/

4voto

TomTom Punkte 1

Sie werden zunächst an eine praktische Grenze stoßen - es ist ziemlich unmöglich, ein 2-GB-Array zugewiesen zu bekommen. Praktische Grenzen, auf die ich gestoßen bin, liegen um die 800 MB beim Start des Programms und gehen danach drastisch zurück.

Alles, was größer als 64 MB ist, ist bei 32 Bit ein Glücksspiel - der Heap für große Objekte wird nicht defragmentiert, so dass Sie 65 MB am Stück frei haben müssen, sonst schlägt die Zuordnung fehl.

Theoretische Grenzen sind:

  • nutzbaren Speicher, insbesondere unter 32 Bit.
  • 32-Bit-Zahlenraum für Index (0 aufwärts - keine negativen Zahlen für Arrays, AUSSER SIE SPIELEN SMART IN CREATION). Sie können Arrays erstellen, die negative Zahlen zulassen, aber nicht mit C#-Standardsyntax - nur mit Reflexion.
  • 2gb pro Objekt.

Aber im Ernst, die praktischen Auswirkungen sind größer.

Für .NET 4.0.... sollten Sie die Verwendung von Memory-Mapped-Dateien in Betracht ziehen ;)

1voto

uriDium Punkte 12771

Ich hätte gedacht, dass die Grenze beim Index liegen könnte. Ich dachte, dass der verwendete Index eine ganze Zahl sein muss, so dass alles, was größer als eine ganze Zahl ist, nicht funktionieren würde, es sei denn, sie haben eine Möglichkeit, das zu umgehen. Das wären dann also 4294967296 Elemente. Ich bin mir nicht sicher, ob das auch nur halbwegs richtig ist. Ich würde die Antwort gerne selbst wissen.

EDIT: Wie tomtom schon sagte, sind Ganzzahlen in der Regel vorzeichenbehaftet, es sei denn, es wird eine nicht vorzeichenbehaftete Ganzzahl verwendet. Also die Hälfte von 4294967296 oder 2147483648 ungefähr.

0 Stimmen

Das ist so ziemlich doppelt wahr. Da Arrays ganzzahlig indiziert sind.... und bei 0 beginnen - ist nur der positive Teil des Indexes verwendbar, also etwa die Hälfte deiner Zahl ;) Deine Antwort ist also doppelt wahr ;)

0 Stimmen

Wenn der Index eine Ganzzahl ohne Vorzeichen ist, wäre dies Ihre Nummer.

0 Stimmen

@TomTom: Nein, ist es nicht. Jedes Array ist ein Objekt und da Objekte auf 2 GB beschränkt sind, hängt es von der Art der Elemente ab, die das Array enthält.

1voto

Austin Punkte 2701

Seit .NET 6 ist die maximale Anzahl von Elemente ein Array enthalten kann, ist definiert durch Array.MaxLength . Es ist derzeit 0x7FFFFFC7 .

Strings sind zwar array-artig, haben aber eine untere Grenze. Die längste Zeichenkette, die man derzeit erstellen kann, ist 0x3FFFFFDF .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X