• ベストアンサー

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

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

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

stackのオーバーフローによるエラーなのかもしれません。 通常スタックにはそれほど大きなメモリは確保されません。オプションでスタックサイズを変更することは可能だと思いますが、 それより確保する位置を変えて関数の外にするか static宣言して確保するか あるいはmallocでヒープから確保する ようにした方がいいでしょう。

amaki
質問者

お礼

みなさんのおっしゃる通りデバックモードで起動すると、stack overflowとなりました mallocの存在は知っていますが、使ったことないのでstatic宣言でうまくいきました。 ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • osumitan
  • ベストアンサー率33% (102/307)
回答No.1

Stack Overflow で出たりするエラーのようですね。 OSにもよるでしょうが、PCで動くOSであれば メモリは使用量が物理メモリの搭載量を超えても HDDにスワップするので問題ないとは思いますが、 それでもStack Overflowは出るかもしれません。 どのようにそのメモリを確保しているかも問題ですが、 それ以前に、そんなにメモリを食う処理自体が問題ですね。 本当に同時にそれだけのメモリを確保する必要があるのか (データをファイルに外出しできないか?など) というところを検討した方がいいと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • メモリと配列に関して

    大量のデータを扱うプログラムを作りたいと思っています。 たくさんの配列(配列はDouble型です。)を使うため、 System.outofmemeoryが出てしまいました。 大きい配列を使うための工夫や、現在メモリを2GB積んでる パソコンで計算しているのですが、メモリ容量に換算して どの程度の大きさの配列を作れるのかが教えていただきたいです。 また、これらに関する疑問に答えてくれる書籍やWebサイトでも 教えて頂ければ幸いです。 お手数ですが、よろしくお願いします。

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

    こんにちは. 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になっていました. 分かりづらい文章で大変申し訳ありませんでした. 何かアドバイスいただければありがたいです.

  • デスククリーンアップしていたら,

    unknown software exception (0xc00000fd)がアプリケーションのox6d861daで発生しました。と出ました解決方法をおしえてください。

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

    今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以上のメモリを必要としてしまう。ということでしょうか? そうだとしたら、やっぱり、こんな容量のメモリを確保するのは無謀ですよね。 でも、この計算はしたいのですが、何か方法はありますでしょうか?

  • インターネットに接続するとエラーが表示されます

    あるホームページに接続すると操作ができなくなり固まってしまいます。そしてページを閉じるとデスクトップに「iexplore.exe -アプリケーションエラー」 例外 unknown software exception (0xc 00000fd)がアプリケーションの(0x037f37e5)で発生しました。このプログラムを終了するには「OK」をクリックしてください。と表示されます。このようなエラーの解決法はあるのでしょうか

  • 配列を宣言した際メモリ内の様子

    「配列」を宣言した際、メモリ内では何が起きているのでしょうか? 配列宣言した際にメモリ内にて、複数のデータを格納する為に、メモリー領域がまとめて確保され、その確保した領域に名前が付けられるのでしょうか? 分かりやすく教えてください。 よろしくお願いします。

  • データー容量について

    初歩的な事をお聞きして申訳御座いません。 データー容量について教えて下さい。 B→KB→MB→GB ×1024づつになるというのは本で見かけた事がありますがもうひとつ、理解できていません。 この単位がどれくらいのデーター量になるのか全くわかりません。 FDの容量は最大1.44MB(百科事典1冊の文字の容量)と認識していますがまちがっていますか? 簡単な説明にて教えて下さる方、お願い致します。

  • 大きな配列を使うには?

    BCCにJavaからポーティングしましたが、配列 int array[max]で、150000程度の大きさを超えると、メモリ不足で止まってしまいます。BCCかリンカのオプションで、ヒープやスタックサイズを変更する具体的な方法、または、大きな配列を上手く使う方法を教えてください。(プログラムはこんな感じ。) #define max_array 140000 /* このサイズを変更したい */ void main() { char array[max_array] ; この後、ヒープも使うのですが、(そのメモリ確保も必要)そこまで 行かない。。。。 (MSのVC++2005でも、同様になりました。) 10数年ぶりにプログラムをしている初心者です。 よろしくお願いします。

  • メモリリークについて

    VC6.0でデバッグ実行すると Detected memory leaks! Dumping objects -> ソースファイル名(932) : {136739} normal block at 0x00FD4AC0, 0 bytes long. Data: <> メッセージがあり メモリがリークしているようです メッセージやソースから察するに 0バイトの領域を確保し それを解放したときに起こっているようです 領域をmallocして 解放ではNULLでなければ解放 という処理はしてはいけないことなのでしょうか 0バイトの領域を確保した場合 又は0バイトの領域を確保しないように 処理しないといけないのでしょうか? 知識のある方よろしくお願い致します

  • アドレス格納のための二次元配列のメモリ動的確保

    アドレス格納のための二次元配列のメモリ動的確保 二次元配列のためにメモリを動的確保しなければならないのですが、 その配列に格納したいものが 「DATA型のポインタ」です。(DATA型はtypedefした構造体です。) プログラム実行中にmallocで確保した、数あるDATA型の構造体の、その先頭アドレスを リストアップするための配列です。 この場合、どのような形でmallocすればよいのでしょうか? 教えていただけるとありがたいです。よろしくお願いいたします。 -- たとえば m×n のint型の配列は、 ◆ int *i; ◆ i = (int *)malloc( m * n * sizeof(int) ); となりますよね。 この要領がでやるのが一般的にわかりやすいものだとするならその方法でやりたい (後発の人が自分のソースコードを読む可能性があるため)のです。 -- 同様にm×nの「DATA型のポインタを格納するための二次元配列」を動的確保したい場合、 ◆ DATA *d; ◆ d = (DATA *)malloc( m * n * sizeof(DATA) ); この文にどのように付け加えたら良いのでしょう? もうあと一歩な気がするのですが(笑)。しかし参考書等で勉強しましたがわかりませんでした・・・。 わかる方、どなたかよろしくお願いいたしますm(_ _)m あとこれだけ通ればコンパイルが通るんです!!!!! たぶん(笑)