- PR -

メモリ確保

1
投稿者投稿内容
ANODA
会議室デビュー日: 2006/06/16
投稿数: 2
投稿日時: 2006-06-16 14:23
初めまして。初めて投稿させて頂きます。

Microsoft Develop Environment 2003 Microsoft VisualBasic.NETで現在開発しています。

PCのメモリとVB.NETに関して御質問です。

PCにメモリを増設し3ギガにしました。
そこでBoot.iniファイルのスイッチに"3GB"を追加し、仮想メモリも変更しプログラムのを作成しました。

プログラム内の宣言は、「Public W(1024& * 1024& * 1024&) As Byte」と宣言しました。

その際にSystem.OutOfMemoryExceptionエラーが発生します。

VB.NETで宣言できる配列はメモリの許す限りとありましたが、対応策等を御存知の方は
お返事下さい。

Short型の配列で3ギガ分の容量を確保したいです(分割可)。

尚掲示板にて不明の際はお返事頂ければ回答致します。

宜しく御願致します。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2006-06-16 14:39
純粋にメモリが足りなかったのではないですか?配列を確保するには連続した空きメモリ領域が必要でしょうから。というわけで、素直にもっと小さいサイズに分割されるか、x64に移行すると良いかと。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-06-16 16:09
メモリの許す限りと言っても、通常の方法では1プロセスあたり
32bitではユーザー空間は2GBまでしか利用できないので無理です。

3GBの配列が必要な処理なんて想像つきません。
目的はわかりませんが、設計を見直す事をおすすめします。

世の中にはオンメモリデータベースのような、
巨大なメモリ空間を活用するものもありますけど。
とっちゃん
大ベテラン
会議室デビュー日: 2005/07/19
投稿数: 203
投稿日時: 2006-06-16 17:42
3Gスイッチを有効にして、3G使えるような状態にプログラムもちゃんと組んだとしても、実際にヒープ領域として3G使えるようになるわけではありません。

3Gのメモリー空間には、EXEが実際に動いているコードの領域や、スタックの領域、さらにはシステムで予約されているローメモリーエリア(1M未満の領域)などがあり、どんなに小さなプログラムを書いたとしても、実際に使えるのはせいぜいで2.5G程度です。
また、.NET の場合は.NET Framework 自身のエリアがありますし、JIT後の本物の実行イメージと、IL部分との両方が入ることになるのでさらに狭くなります。

3Gオンメモリーでどうしてもほしいということなら、64bit OS と 64bitアプリへの変更がよいかと。
それと、実装メモリーが3Gではちょっと足りませんね。これに実行アプリ分+常駐物+OSの分は必要なので、さらに1G以上は最低でも追加しないとスワップしまくりになります。

一応、32bitOS(ただし、2003だけだったはず)でも PAE を使えば3Gはおろか4Gを超えるメモリーも利用できますが、やるとなると、Unmanaged じゃないと実現できません。
.NET Framework にそのような仕組みがありませんからね。

いずれにしても 1G を大きく超えるメモリーを32bitアプリで扱いたいというのであれば、プログラムだけではなく、プロセス空間全体の最適化まで考慮しないと、実現は厳しいです。

_________________
// とっちゃん(高萩 俊行)@わんくま同盟
// とっちゃん’Blog
// MS-MVP for Developer Tools - Visual C++
// WindowsInstallerの話題はhttp://www.freeml.com/msiまで
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-06-16 19:25
大量のデータを高速で処理したい要件があるのだと想像できますが、全てを配列にするよりも、処理をする単位でファイルごとに切り出すなどロジックの検討をしたり、データベースを理由したりと、いろいろな方法を検討してみても良いかもしれません。

#どのような場合に、このような方法が必要になるのか興味はありますが・・・
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2006-06-16 23:27
引用:

R・田中一郎さんの書き込み (2006-06-16 19:25) より:
大量のデータを高速で処理したい要件があるのだと想像できますが、全てを配列にするよりも、処理をする単位でファイルごとに切り出すなどロジックの検討をしたり、データベースを理由したりと、いろいろな方法を検討してみても良いかもしれません。

#どのような場合に、このような方法が必要になるのか興味はありますが・・・



なんかの大規模シミュレーション オンメモリデータベース?
プログラム=データ構造+アルゴリズムというのを知らないだけとか?



ANODA
会議室デビュー日: 2006/06/16
投稿数: 2
投稿日時: 2006-06-19 09:24
皆様から頂いた回答大変参考になりましたのでこの場をお借りして感謝致します。
ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)