• 締切済み

C#で大量のデータを扱うソフトを作っています

C#で大量のデータを扱うソフトを作っています。50程度のメンバ変数を持つクラスをDictionary ジェネリッククラスを使用して1~10億個ぐらい作成しようと思っていますが、4000万個あたりでエラーが起きます。またこのジェネリッククラスを10~50個に増やしたいのですがやはりエラーが起きそうです。 エラーが起こる原因は何でしょうか。回避する方法などあるのでしょうか Windows 7 64ビットのOSでVisual Studio2008の環境です。メモリは8GB を搭載しています。

みんなの回答

noname#187269
noname#187269
回答No.6

試しにtest クラスを作って、Dictionary<int,test> で10億個作ってみましたが、別にエラーにはなりませんね。ま、クラスが肥大化すれば別なんでしょうが。 Windows7 64bit corei7-3770 32GB です。 過去の経験から申しますと、原因不明のエラーがメモリーの破損に起因するという事がありました。 普段はエラーはでませんが、そういう大容量メモリーを使うプログラムでのみ発症しました。 最終的にはメモリテストをPCショップでやってもらって初めて確定でき、メモリー交換をしてもらう事で解消しました。メモリーの保証書はとっておくものですね。

CatandCat
質問者

補足

もしかすると私が勘違いしているかもしれませんが、小さなクラスtest class を作成し、 Dictionary<long, test> t = new Dictionary<long, test> test te = new test(); for (long i = 0; i < 1000000000; i ++) { t.Add(i, te); } 上記のコードではメモリ不足になります。 for (long i = 0; i < 1000000000; i ++) { Dictionary<long, test> t = new Dictionary<long, test> } 上記のコードでは確かにエラーにはなりませんが Dictionary を作成して要素を10億個追加することにはならないと思います。

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.5

#4です。 >仮想メモリはどう設定するのでしょうか。 これは単なるWindowsの設定です。 検索すればいろいろ出てきますが、Windows7なら、このあたりでしょうか? http://121ware.com/qasearch/1007/app/servlet/relatedqa?QID=013838 >プログラムを64ビットで動かすにはどこを設定すればよろしいでしょうか。 any cpuになっているなら大丈夫だと思います。 32bitで動いているとしたら、だいたい1.5GbyteほどメモリをつかったところでOutOfMemoryになると思いますし。

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.4

仮想メモリは十分(100G~5T程度?)確保されていますでしょうか。 あと、C#の構成はx64、あるいはany cpuが選択されていますでしょうか。 プログラムが64bitで動いていれば、メモリ空間は足りているはずなので、仮想メモリが期待通りに動作してくれれば、動きそうな気はします。 実際に試したことはないので、憶測ですけど・・・。 まあ、仮に動いたとしても、仮想メモリ頼りでは効率が悪そうなので、#1さんのおっしゃるようにdatabaseの使用を検討したほうがよさそうですけどね。

CatandCat
質問者

補足

>仮想メモリは十分(100G~5T程度?)確保されていますで>しょうか 仮想メモリはどう設定するのでしょうか。C#の構成は any cpu が選択されています。 プログラムを64ビットで動かすにはどこを設定すればよろしいでしょうか。

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.3

エラーの原因は#1,2の方のおっしゃる通りだとは思いますが、エラーが起きてるのがわかってる状況ならエラーメッセージが出力されていると思うのですが、そのエラーメッセージを書かれないのは何故ですか。

CatandCat
質問者

補足

うっかりしていました。エラーは「OutOfMemoryExceptionの例外がスローされました。」です。

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.2

明らかにメモリ不足です。 50 個のメンバ変数がすべて int だとして、1000 ≒ 1024 = 2^10 ですから 4000万個 ≒ 40M個になり、  4 (int 型のサイズ) * 50個 * 4000万個 ≒ 8G バイト という計算になります。 というか、なんでそんなにいっぺんに1億個ものデータが必要な処理を行う羽目になったのでしょうか。 その辺を具体的に補足いただければ代替案が出せるかもしれません。

CatandCat
質問者

補足

メンバ変数は long です。ので16Gバイトのようですが、なぜこんなにデータが必要なのかということに関しては以下の通りです。 一つのクラスがある事象を表現するのに long値 で50ぐらいを使用します。そのクラスが初期値としてたとえば100万個作成しておきます。 それらの事象を時間の経過とともに計算して、その結果、自分自身(クラス)を増減します。最低は0になり、最高に増加した場合はたとえば1000倍の10億個といった感じです。 計算は属性値のメンバ変数を必ず参照して行いますので大量のクラスをHDDに保存しておくと計算に時間がかかりますのでメモリ上に保存しておきたかったのです。 言ってみれば個数の増減シミュレーションです。

回答No.1

メンバひとつで4byteとして要素ひとつに50x4 = 200byte、 それが4000万個だと 200 x 4000 x 10000 = 8Gbyte そりゃエラーが起こるでしょうねぇ。 データを減らすか、それができなきゃ Database 使うかな。

関連するQ&A