• ベストアンサー

メモリと配列に関して

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

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

  • ベストアンサー
  • AKARI0418
  • ベストアンサー率67% (112/166)
回答No.1

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=31510&forum=36&3 を参考にされてください。 配列の場合などは、連続したメモリ領域の確保が出来ずにOutOfMemoryExceptionが発生することがあります。 とのことです。 配列を分割して扱う、または配列をArrayList等にすることで解決できると思います。 速度面を考慮すると、分割でしょうか。

fallen4487
質問者

お礼

ありがとうございました。理解しました。

関連するQ&A

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

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

  • データ数の多い構造体配列について

    visual c++で配列をメンバーに持つ構造体配列を定義したいと思っています。 しかし、以下のように定義してもプログラムが実行されません。 配列の容量が大きいのかもしれませんが、 大量のデータを扱いたいので容量を小さくはしたくありません。 大量のデータを扱うのに何かいい方法はないでしょうか。 struct X { double A[1000]; }; : : : struct X B[10000];

  • 多次元配列のデータ個数やメモリについて

    今,2次元配列で, static double g[20000][10] として,配列を使用することを考えています。(他にも一次元配列を多くあります)これを使って計算を行います。 g[20000][9]の場合は正常に動いたんですが,g[20000][10]にするとaccess violation(アクセス違反)のように出ます。メモリの問題でしょうか,それとも限界なんでしょうか,,,,? この解決策はありますか?よろしくお願いします。 Visual C++6.0 で動作

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

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

  • メモリについて

    現在FMV BIBLO NB75L(ノートPC)を使っています。 現在のメモリ容量が標準512MB(オンボード)で最大で1.5GBまで増設できると製品仕様に記載されているのですが・・そこで疑問なのですが、オンボードで512ですよね!?単純計算なのですがもし1GB増設した場合は1.512GBで仕様に書いてる数値よりオーバーですよね。。それってどうなのでしょうか?メモリが多ければいいってわけじゃあない!という話を聞いた事があるのですが。何か不具合とかパフォーマンスが低下するとか。。パソコンにとって+か-か疑問に思い質問してみました。

  • ダブルチャネルと、単なるメモリ1枚差しの違い

    PCのメモリについて質問です。 ダブルチャネルで1GBのメモリを2枚差すのと、単に2GBのメモリを1枚差すのでは、 性能にどのような違いがあるのでしょうか? また、トリプルチャネルというのは、 同容量のダブルチャネルの1.5倍、同容量の1枚差しの3倍の性能があるのでしょうか?

  • 今、ある数値計算ソフトで2×3×400の配列を扱おうとしているとします

    今、ある数値計算ソフトで2×3×400の配列を扱おうとしているとします。なお、 各配列には整数0か1が入るとします。このとき、この配列はメモリ上の容量は いくらになるのでしょうか? 他のケース、例えば同じ次元の配列だが、各配列に1から100までの整数が入るケース や実数が入る場合など、計算できるようになりたいので、計算過程を併せて 教えていただけると幸いです。

  • 32bitOSで利用できるメモリ容量

    とあるお客様から質問されて困っています。 HPのワークステーションxw6600にメモリ増設をしたのですが、OSから認識する容量で疑問があります。 増設前物理メモリ:3GB  OSから認識できる容量も3.00GBとなっていました。 増設後物理メモリ:8GB  OSから認識できる容量が3.00GBとなっています。 32bitOSが3~3.5GB程度しか認識できない理由として、システムデバイスに0.5~1GB程度のアドレス空間がマッピングされるためという認識です。 ここで疑問なのが、なぜ、増設前の3GBのときにOSから認識できる容量が2GB~2.5GB程度とならなかったのかです。 今後、Windows7にアップグレードするということでメモリ増設を行ったのですが、現在WindowsXP32bitでこのような疑問がでたようです。 増設前は、1GBx2枚&512MBx2枚で3GB。 増設後は、2GBx4枚で8GB。 メモリの差し方など関係しているでしょうか? ご回答宜しくお願い致します。

  • 配列ポインタの関数中のメモリ領域

    C初心者です。 関数中で配列ポインタを宣言する場合についての質問です。 たとえばDouble型の2次元のローカルな配列ポインタを用いる場合、 その配列要素数が100である場合は void 関数名(引数1,引数2,...){ int i; double *a[2]; for(i=0;i<2;i++){ a[i] = (double*)malloc(100*sizeof(double)); } for(i=0;i<2;i++){ free(a[i]); } } またこの値を引数1とする場合、引数1をoutとすると void 関数名(double *out,....) とし、 for(i=0;i<2;i++){ out[i] = a[i]; } とすればよいのでしょうか? もしこれがあっているとすると、つぎのような現象で困っています。 配列要素数を50000個ぐらいとし、複数の関数で、同様に mallocを用いて、配列ポインタのローカルでメモリ領域を確保しようとした場合、コンパイルは成功するのですが、その後実行すると、エラーが発生したというメッセージとともにコマンドウィンドが強制終了します。 コンパイラはVisual C++ EXpress Edition 2008です。 データサイズを小さくすると、エラーは起きません。 malloc関数で確保するメモリサイズは、関数の入力引数で定義された変数を用いて計算しており、データサイズに応じて変更されます。 よろしくお願いいたします。

  • 配列をEraseしてもメモリが開放されていない?

    すみません。一度質問を載せた後で、補足で絵を載せようとしたのですができなかったので 再投稿させていただきます。(元の質問はけしました。) -------------------------------------- こんにちは、今作成しているエクセルのVBAで配列を膨大に食ってしまい、メモリ不足に落ちいるという現象に悩まされています。 そのため、なるべくいらなくなった配列はEraseステートメントを使って解放しようとしてるのですが、 これが上手くいっている気がしません。 ためしにフォームと、ラベルを1つずつ用意し、下記のような配列をどこまで作れるか計算するプログラムを組んでみました。 1回目、ans(i) に"a"というaを1個のみ格納した場合で計算すると、配列は2970万個できます。 2回目、ans(i) に"aaa~a"というaを64個格納した場合で計算すると、配列は770万個できます。 まぁ、ここまでは当然の結果だと思います。 可変長のString型変数の場合は、割り当てられるメモリサイズが固定ではないらしいので (前回の質問で教えてもらいました) しかし3回目、ここでもう一回、1回目と同じ、"a"を一個のみ格納した場合で計算してみます。 私の予想では1回目と同じ2970万個程度の配列が作れると思っていました。 なぜなら、Eraseステートメントでメモリを解放していたし、 タスクマネージャーのPF使用量(おそらくメモリの値)を見ても2回目を実行した後の値は 1回目前と同じ値に戻っているからです。 しかし、実際試してみると、 2回目と同じ770万個の配列しかつくれませんでした。 つまり、Eraseステートメントを使用しても配列の上限値は元の状態に戻らなかったのです。 どうすれば、配列を再び2970万個作れる初期の状態に戻せるのでしょうか? 現時点ではエクセルを起動しなおせば、元に戻りますが、それでは困ります (プログラムの途中で配列の数を減らしたり、コピーしたりを行っている為、 どうしてもプログラム中でメモリの解放を行いたいからです) また、添付した絵は、実行した時のタスクマネージャーの様子です。 参考になれば幸いです どうか、みなさんお知恵をお貸ししてください --------------------------------------------------- '実行するときは、フォームとラベルを1つずつ用意して実行してください Public Sub 配列上限取得計算() On Error GoTo ErrEnd Dim i As Long Const kankaku As Long = 100000 Dim ans() As String ReDim ans(1 To kankaku) As String ans(1) = 1 i = 2 UserForm1.Show vbModeless Do If i Mod kankaku = 0 Then DoEvents UserForm1.Label1 = i ReDim Preserve ans(1 To i + kankaku) As String End If '最初にaを1個のみ格納した場合は、2970万個まで配列が作れるが、次にaを64個格納した場合は770万個まで作れた。 'しかし、その直後にまた、aを1個のみ格納した場合で実行してみると、770万個しか作れない 'つまり、Eraseステートメントを使っているにも関わらず、同じ条件のプログラムでも配列の上限が下がってしまう。 'この現象をなんとか回避したい。元の状態にリセットするにはエクセルを起動しなおさないと直らない。 '1回目と3回目に実行するコード、2回目はコメントアウトしてください ans(i) = "a" '2回目に実行したコード、2回目はコメントアウトを解除してください。 ' ans(i) = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" i = i + 1 Loop Erase ans Unload UserForm1 Exit Sub ErrEnd: Erase ans MsgBox "これ以上の配列を設定できません。" & vbCrLf & "上限は" & i & "です。" & vbCrLf & Err.Description Unload UserForm1 End Sub

専門家に質問してみよう