• ベストアンサー

動的確保できるメモリ容量

こんにちは. 2個のファイルを同時に開いて処理するプログラムを作成したところ, メモリの確保に失敗するエラー(std::bad_alloc)が発生してしまいます. *********************** 環境 OS:WindowsXP-sp2 メモリ:768 MB HD空き:約30GB 開発環境:C++Builder 6 *********************** 開こうとするファイルは,各250MB程度で,それぞれを読み込んだ後,それ ぞれに対して同じ大きさの配列を確保するため,必要メモリ容量は, 約 1GB 程度になります. ちなみに,配列の確保はnewを用いています. PCに搭載している物理メモリが768MBなので,仮想メモリにアクセスする のは当然だと思います.ただ,ハードディスクの空きも十分なので,実行 速度が遅くなったとしても,無事処理できると思っていました. ヒープサイズが関係していると思い,C++Builderのリンカの設定で予約ヒー プサイズを最大に設定しましたがダメでした. また,Windowsのシステムのプロパティで,仮想メモリを4000MBにしました がこれもダメでした. プログラムで一度に確保できるメモリサイズには限界があり,それ以上の サイズを確保することは不可能なのでしょうか? なお,2つのファイルを同時に開いて処理しようとするとエラーになって しまいますが,作成したソフトを2つ実行して,それぞれで上記ファイルを 1つずつ開くと,合計の必要メモリは同じにもかかわらず,エラーになりま せん. このときタスクマネージャでPF使用量を確認すると,1.2GBになっていました. 分かりづらい文章で大変申し訳ありませんでした. 何かアドバイスいただければありがたいです.

  • ojar
  • お礼率100% (6/6)

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.1

動的に確保したメモリを同時にアクティブに出来る合計サイズは、物理メモリ量を超える事は出来ません。 「メモリをアクティブにする」とは「CPUが物理的にアクセスが可能なメモリに対して、確保した領域をマッピングする」と言う事です。つまり「CPUが何時でも直接メモリにアクセス出来るようにする」と言う事です。 物理メモリが768MBしか無いのに「CPUが物理アクセス可能な領域を1024MB(1GB)作れ」と言っても無理な訳です。 「仮想メモリがあるから」と安心は出来ない訳です。 仮想メモリが使われるのは「プロセスをスイッチングする際、今まで動いていたプロセスをサスペンドし、サスペンドされるプロセスが確保していた動的メモリの物理メモリ内容を仮想メモリに移動し、他のプロセス用に物理メモリを開け渡す時」と「巨大な動的メモリを確保した際、アクティブではないメモリページを仮想メモリに保存する時」です。 仮想メモリを有効に使いたい場合は、API関数でメモリハンドルを作成し、物理メモリサイズを超えない大きさのアクティブページを作り、そこに対してメモリの読み書きを行い、読み書きが終わったアクティブページを非アクティブにして仮想メモリに追い出す、と言う処理が必要です。 メモリ使用量を半分にしたプログラムを2つ実行してエラーにならないのは「ある一瞬だけに注目した場合、物理メモリ上には、プログラム1つ分のメモリしか居ない」からです。

ojar
質問者

お礼

教えていただき,どうもありがとうございました. 確かに,タスクマネージャでメモリの消費量を追っていくと,物理メモリを超えるくらいでエラーになっていました. 今後とも質問させていただくことがあるかと思いますが,どうぞよろしくお願いいたします.

その他の回答 (1)

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.2

サーバー系で無いWindowsだと使える論理メモリ上限は4GBで、うち2GBはOS領域のため、通常のプロセスが使えるのは2GBまでです。(OSの制限) この2GBも全てヒープとして使えるわけではなく、プログラム自身の領域、スタック領域にも使われますし、ライブラリだのDLLだのが消費するでしょうから、更に少なくなります。 もしかすると、使っているライブラリや何かで更に制限があるかも知れません。 プログラムを二つ実行する場合はそれぞれ独立したメモリ空間が使えますから、同時に使えるメモリ容量は2GBを超えることが可能ですから、 症状から考えて単純に消費メモリが大きすぎて実行不可能の状態だろうと思われます。 仮想メモリのサイズは関係ありません。 これは動作している全てのプロセスが使うメモリの合計の上限が変わるだけです。 #1の方が書かれている内容は、newで確保した領域の場合は関係ないと思います。 物理メモリをロックして使うような話なら別ですが。

ojar
質問者

お礼

プログラムからメモリを確保しようとした場合,仮想メモリのサイズは関係ないのですね. 結局のところ,もっとも簡単に問題を解決するのはメモリ増設であるようです. 貴重なご意見本当にありがとうございました.

関連するQ&A

  • 配列データ容量とメモリについて

    プログラム中に、4バイトのデータを(2^24)×3個の配列に確保し計算するところがあるのですが、 この場合の配列のみのデータを メモリに確保するためのメモリの必要容量は 4×(2^24)×3=201326592バイト=201.32・・メガバイトになりますよね。 メモリはOSなどアプリケーションを立ち上げる時にも使いますが、それらの分を差し引いても、202MBぐらい空いてるとすれば上記のことをできるのでしょうか?  プログラムを実行すると 例外 unknown software exception (0xc0000fd)がアプリケーションの0x00401707で発生しましたと なって終了してしまいます・・ それとももともと確保できる容量はソフト的に決まってるのでしょうか。 ちなみに使用環境のPCのメモリは512MBのを一個刺してあります。コンパイラはVCです。

  • 大容量のメモリ確保をスワップ無しで行う方法について

    教えてgooの識者のお知恵をお借りしたくご質問させていただきます。 表記の通り、C&C++を用いて、大容量のメモリ確保をスワップ無しで行いたく考えております。 質問の内容としてましては、(1)、(2)の2点があります。 (1) 「VirtualAllocに失敗するという理由としてどのような原因があるのでしょうか?」  VirtualAlloc関数に、引数MEM_RESERVE、MEM_COMMITを渡してメモリ確保を行ってみたのですが、  メモリ確保に成功するPCと成功しないPCが存在し、理由が分からずにいます。  (いずれもタスクマネージャなどで確認すると物理メモリの空き容量は1.3GB程度空いているPCです。)  (確保に失敗するPCで確認してみたところ、650MB付近までは確保に成功します。) (2) 「VirtualAlloc以外にスワップを回避して大容量のメモリを確保する方法はあるのでしょうか?」  newでは確保ができるのですが(当然なのかもしれませんが)、  ページングファイルに移動されてしまうと処理が重たくなってしまうので採用できない方法だと考えています。 プログラムの内容は、外部インターフェースからの入力を待つために常駐し、入力した900MB分のデータを高速に処理するというものです。 900MBのデータ量は必須で、高速かつ安価なPC構成とする必要があるために全ての処理をメモリ上で行う方法を選択しました。 ハードウェアは2GB以上のメモリを搭載、Windows XP SP3 32bitのPCに限定しています。

  • メモリの動的確保(大容量)について

    今640*480の画像を、10枚読み込み、1枚を1行に入れた 2次元配列、10*307200を作りました。これをXとおきます。 この転置行列、307200*10と、Xを掛けて、 307200 * 307200 の行列を作りたいです。 その行列の確保に、 xx = (double (*)[307200])malloc(sizeof(double) * 307200 * 307200); とやったところ、 warning C4307: '*' : 整数定数がオーバーフローしました。 というエラーが出てしまいました。 これって、メモリが確保出来ないっていうエラーですよね? 無知なので教えて頂きたいのですが、 doubleって8バイトなので、この計算だと 8 * 307200 * 307200 = 700G以上のメモリを必要としてしまう。ということでしょうか? そうだとしたら、やっぱり、こんな容量のメモリを確保するのは無謀ですよね。 でも、この計算はしたいのですが、何か方法はありますでしょうか?

  • 仮想メモリの低下

    photoshop CS2でPSDファイル(3089KB)を開こうとするとphotoshopCS2が真っ白の画面になり、「このプログラムは応答していません」というエラーが出るのですぐに終了をしました。 すると今度は、 Windows 仮想メモリ最小値が低すぎます。といエラーが出てきて、 システムの仮想メモリがなくなって来ています。 仮想メモリ ページ ファイルのサイズを増やしています。 この処理の間、いくつかのアプリケーションのメモリ要求が拒否されることがあります。 と出ます。 仮想メモリーを初期サイズ1000MB、最大サイズを1486MBに設定して増やしてみたのですが、やはりファイルを開けませんでした。 どうしたらよいのか分かりません。 大至急教えてください。よろしくお願いいたします。 PCはNEC VALUESTAR VF300/5で、Windows XP Home Editionで、メモリは増設していて992MB RANです。 足りない情報などありましたら追記しますので、よろしくお願いいたします。

  • 仮想メモリについて 教えてください

    仮想メモリ関連の既出の質問を探してみたのですが 自分が疑問に思っていることへの回答が見当たらなかったので 質問させていただきます WindowsXPではプログラムを実行する際に プログラム全体及び 関連データをすべて物理メモリまたは仮想メモリに割り当てる のでしょうか? どういうことかと言いますと 例として 物理メモリ256MB 仮想メモリ256MB として 現動作中の空き物理メモリ100MB 空き仮想メモリ256MBの状況で 1 50MBのプログラムを実行した時はすべて物理メモリに割り   当てられるのか? 2 加えて60MBのプログラムを実行した時には10MB分が仮想メモリ   に割り当てられるのか? 3 加えて50MB分のプログラムを実行して そのプログラム上で   300MBのデータを読み込もうとした時には 仮想メモリが少ない   等のエラーが発生するのか? 条件がアバウトかとは思いますが よろしくお願いします

  • メモリ確保方法を教えてください。

    Visual Studio.NET でC言語でプログラムを組んでいるのですが、二次元配列をたくさん使用したプログラムで、コンパイルして実行しようとするとエラーが表示されてしまいます。配列の要素を少なくすると実行はされるのですが、要素数が多くなるとエラーが表示されます。 実行時にユーザの使用メモリ数が制限されているなら、その使用メモリを増やす方法があれば教えていただけませんか?よろしくお願いします。

  • 2次元配列を確保したいのですが、

    2次元配列を確保したいのですが、 size of array 'buf' is too large というエラーで確保できません。 mallocを使って確保しようとしましたが、コンパイルできましたが、 実行するとメモリ確保に失敗します。 大きな2次元配列を確保する方法を教えてください。

  • 配列の操作やメモリの確保のミスについて

    プログラミング初心者です。 Visal Studio 2010を使用してC++の勉強をしています。 配列の操作やメモリの確保でエラーを起こした場合、OSや他のプログラムにもエラーを引き起こすことがあるのでしょうか? (記述・実行しているプログラムは教材に記されているただのコンソールアプリです。複雑であったり大規模なものではありません。) たとえば、mallocで配列のメモリを確保したが、その配列の要素数以上に値を書き込んだり参照したり、freeをし忘れたりした場合です。 その時、想定していないメモリ領域に値が書き込まれることで、他のプログラムが壊れたりするんじゃないかと心配です。 というのも、配列の操作やmallocを失敗したときに、パソコンの動作が不安定になるのです。(画面がちらついたり、表示がおかしくなる。) explorer.exeを再起動するだけで収まるように見えるのですが、何が起きているのか不思議です。 以上になります。長文お読みいただきありがとうございました。 よろしくお願いいたします。

  • 仮想メモリの初期サイズを1150MBにして、最大を2048MBというのはまずいでしょうか?

    XPを使用していて初めて仮想メモリが足りないか、限界か、という黄色色の警告マークがタスクバーに表示されました。 これで、仮想メモリ384MBだったのを、2048MBにしました。 物理メモリは、512MBと256MBの二枚ざしで、768MBです。 仮想メモリの意味すらよくわかっていないのですが、 とりあえず、値が大きかったらいいかなと思って、 タイトルにありますような量に設定しました。 初期サイズが1150MBというのは、なぜかこの値がでてきました。 私も意味がわかりません。 1024MBなら意味がわかる気もするのですが・・。 Cドライブはプログラムファイルだけを入れている状態です。 25GBをCドライブに割り振っていましたが、残りは、13GBぐらいです。 Dが50GBぐらいあるのですが、そちらは、マイドキュメント等の データファイルをいれています。 こちらも残りは10GBぐらいですが、 これからもまだデータが増えるので、こちらに仮想メモリの設定するのは、 厳しそうです。 Cドライブはこれ以上アプリ等はいれる予定もないので、 常時10GBぐらいは確保できそうです。 私の環境での推奨値がありましたら、アドバイスをお願いします。

  • メモリ容量について‥

    ちょっと前から、お絵かきソフトをいじっていると「メモリが足りません」とか「仮想メモリが‥どうのこうの」というエラーが出るようになりました。 メモリが足りなくなるほどデータを詰め込んでいるわけではないと思っていますが、何が原因なのか分かりません。 でも、 パソコン情報にてメモリの空き領域を見たところ、 ●ハードディスクの要領 27.95GB ●ハードディスクの空き領域 15.67GB ●メモリの要領 94.5MB と、ありましたが、詳しくないので分からなくて、これってメモリが足りないってことなのでしょうか? メモリの要領が少ないような気がするのですが、もしそうなら、メモリスロット(?)を替えれば解決するのでしょうか? あと、詳しくないのに「仮想メモリ」をいじってしまったのですが、いじらない方が良いと言っている人がいて‥やっぱりいじらない方が良いのでしょうか? よろしくおねがいします!

専門家に質問してみよう