5 Stimmen

64-Bit VB.NET weist > 2GB RAM zu (.NET Bug?)

Ich habe eine 64-Bit-VB.NET-Anwendung und möchte einen Puffer mit einer Größe von mehr als 2 GB zuweisen.

Im folgenden Code lösen sowohl die "new" als auch die "ReDim" eine "OverflowException" aus.

Wie kann ich Puffer > 2 GB zuweisen, wenn diese Funktionen nur vorzeichenbehaftete 32-Bit-Werte akzeptieren?

(Ist dies in C# möglich?)

bearbeiten - Ich verwende WinXP 64 mit 4 GB RAM.

Dim width As Long = 19005
Dim height As Long = 32768

Dim buffer() As Byte = New Byte((width \* height \* 4) - 1) {}

Dim size As Long = (width \* height \* 4) - 1
ReDim buffer(size)

1 Stimmen

Woher wissen Sie, dass es eine 64-Bit-Anwendung ist? Wie wird sie in der Prozessanzeige angezeigt (wenn Sie sie lange genug laufen lassen)?

2voto

user79755 Punkte 2533

Offenbar ist es nicht möglich, mehr als 2 GB zuzuweisen, selbst wenn die 64-Bit-.net-Anwendung auf einem 64-Bit-Betriebssystem läuft.

Ich finde das sehr enttäuschend und völlig ohne Rücksicht darauf, wofür 64-Bit-Anwendungen und -Betriebssysteme gemacht sind. Ich habe zu tun mit gigantisch Bilder und würde gerne mit den rohen Bytes im RAM auf einmal arbeiten können. Jetzt muss ich Paging-Algorithmen implementieren, um die Chunks auf 2 GB zu begrenzen.

Hey Microsoft, wie wäre es, wenn Sie dies in der nächsten .NET-Version beheben? Ja, ich sagte reparieren. Das liegt daran, dass sie kaputt ist. Wie wollen Sie erwarten, dass 64-Bit-Anwendungen zu nehmen, wenn Sie tun dumm Dinge wie diese. (Können Sie sagen, dass ich verärgert .) Danke fürs Zuhören.

Link

http://blogs.msdn.com/joshwil/archive/2005/08/10/450202.aspx

0 Stimmen

Wenn Sie genau lesen, ist das nicht ganz richtig. Er bietet sogar 2 praktikable Lösungen an.

1 Stimmen

Es ist Es stimmt, dass man mit den .net-Funktionen new / redim nicht mehr als 2 GB zuweisen kann. Wo sehen Sie, dass das nicht wahr ist. Die Alternativen sind mehr Arbeit und sollten zumindest in der Theorie völlig unnötig sein.

0 Stimmen

Die Klasse "Big Array" erscheint mir verdächtig, und ich würde sie nicht verwenden, selbst wenn ich dafür bezahlt würde. Die benutzerdefinierte Speicherzuweisung wie Paint.NET könnte nützlich sein.

2voto

Paul van Brenk Punkte 7189

Ich denke, dass der UnmanagedMemoryStream das tut, was Sie brauchen. MSDN-Dokument für UnmanagedMemoryStream

Ich halte es für eine schlechte Idee, in einer Garbage-Collector-Umgebung einen großen Speicherbereich zuzuweisen, da die meisten Garbage-Collectors für kleine und kurzlebige Objekte optimiert sind. Daher ist die Verwendung von Rohspeicher im Allgemeinen eine bessere und leistungsfähigere Lösung für sehr große Objekte.

1 Stimmen

Er scheint immer noch auf 2 GB begrenzt zu sein, da er ein "Integer"-Argument (32 Bit mit Vorzeichen) benötigt.

0 Stimmen

Ja. Es nimmt int32 beim Lesen und Schreiben, aber der Konstruktor nimmt 64bit Ganzzahlen. msdn.microsoft.com/de-us/library/dd267517(VS.100).aspx

2 Stimmen

Es ist auch nicht für Visual Basic verfügbar, da "Visual Basic keine APIs unterstützt, die unsichere Typen verbrauchen oder zurückgeben". msdn.microsoft.com/de-us/library/zw66yex7.aspx

0voto

Sam Harwell Punkte 94511

Das Folgende funktioniert [theoretisch] (C#-Syntax):

Array.CreateInstance(typeof(int[]), 0L);

Bearbeiten: Erstellen Sie einen Typ mit einem zugewiesenen Array fester Größe von 1GB-Arrays. Sie können in der Item-Eigenschaft über eine Verschiebung neu indizieren.

0voto

Otávio Décio Punkte 72052

Möglicherweise müssen Sie dafür Memory-Mapped-Dateien verwenden, werfen Sie einen Blick auf die MapViewOfFile Funktion.

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