2009-07-31 22 views
4

私は64ビットのVB.NETアプリケーションを使用しており、サイズが2GBを超えるバッファを割り当てたいと思っています。64ビットVB.NET 2GB以上のRAMを割り当てる(.NETバグ?)

"new"と "ReDim"の両方が "OverflowException"をスローします。

これらの関数で符号付き32ビット値のみを受け入れるには、バッファを2GB以上割り当てることはできますか?

編集(?C#で、このことは可能です) - 私は4GBのRAMとWinXPの64を実行しています。

 
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

64ビットアプリケーションであることをどのように知っていますか?プロセスビューアでどのように表示されますか? –

答えて

1

明らかに、64ビットOS上で動作する64ビット.netアプリケーションでも2GB以上を割り当てることはできません。

私はこれが非常に残念であり、64ビットのアプリケーションとOSが何のために作られているかは全く考慮していません。私はの巨大なイメージを扱っています。すべてのRAWバイトを一度にRAMで処理できるようにしたいと考えています。今ではチャンクを2GBに制限するページングアルゴリズムを実装する必要があります。

こんにちはマイクロソフトでは、今後の.NETリリースでこれを修正していますか?はい、私はと言いました。それは壊れているからです。あなたが行うときに、どのように64ビットアプリケーションが離れることを期待しますか愚かなのようなもの。 (あなたは私がに怒っていると言うことができますか?。)聞いてくれてありがとう。

Link

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

+0

もしあなたが厳密に読むと、それはまったく真実ではありません。彼は2つの実行可能なソリューションを提供します。 – NotMe

+1

.net new/redim関数を使用して2GB以上を割り当てることはできません。それが真実ではないとあなたはどこから分かりますか?代替案はより多くの作業であり、少なくとも理論的にはまったく必要ないはずです。 – user79755

+0

"Big Array"クラスは私には疑わしいと思っています。あなたが私に支払った場合、私はそれを使用しません。 Paint.NETのようなカスタムメモリアロケータが便利かもしれません。 – user79755

0

次の作品[理論的に(C#構文):

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

編集:1GBのアレイの固定されたサイズに割り当てられた配列を有する型を作ります。シフトを介してItemプロパティのインデックスを再作成することができます。

1

私はUnmanagedMemoryStreamは何が必要ないと思います。 MSDN doc for UnmanagedMemoryStream

ほとんどのガベージコレクタが短命のオブジェクトである&に最適化されているため、ガベージコレクション環境で膨大なメモリを割り当てることは悪い考えです。したがって、RAWメモリを使用することは、一般に、非常に大きなオブジェクトに対してより優れた、より性能の高いソリューションです。

+0

この度はありがとうございます。 – user79755

+1

「整数」(32ビット符号付き)引数を取るので、まだ2GBに制限されているようです。 – user79755

+0

はい。読み書きの際にはint32が必要ですが、コンストラクタは64ビットの整数をとります。 http://msdn.microsoft.com/en-us/library/dd267517(VS.100).aspx –

0

これにはメモリマップされたファイルを使用する必要があるかもしれませんが、MapViewOfFileの機能を見てください。

+2

MemoryMappedFilesを使用する必要はありません... – user79755

関連する問題