• 締切済み

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% (1622/5658)
回答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

  • C# 「データが失なわれる可能性を防ぐため、…」

    Visual Studio 2008 C# での質問です。 プログラムを作りこんでいくうちに、ソリューション・エクスプローラからデザイナの表示をクリックすると、 「データが失なわれる可能性を防ぐため、デザイナの読み込み前に以下のエラーを解決する必要があります。」 「ファイル内にデザインできるクラスがないため、このファイルのデザイナを表示できませんでした。ファイルの以下のクラスがデザイナで見つかりました。CRsvCalForm --- 基本クラス 'foo.Common.AbstructFooForm' を読み込めませんでした。アセンブリが参照されているか、およびすべてのプロジェクトがビルドされているかを確認してください。」 と表示されます。 修正したコードのフォームだけでなく、今まで手をつけていないフォームも表示できなくなりました。 SVN から(修正前の)「CRsvCalForm.cs」「CRsvCalForm.design.cs」「CRsvCalForm.resx」をエクスポートして Visual Studio を立ち上げても一緒の現象です。 SVN を直接 Visual Studio で開くと、正常に動いています。 「データが失なわれる可能性を防ぐため、デザイナの読み込み前に以下のエラーを解決する必要があります」でぐぐって見たのですが、有効そうなページは見つかりませんでした。 どなたか解決方法を知ってみえる方、ご教示いただきますようお願いします。

  • EXCELで大量セルコピー時に固まるのを

    EXCELで大量セルコピー時(3-40万行テキスト。数式は無し)に固まるのを 何とか緩和したく、設定や裏技を探しています。 USBメモリを挿して、何とかスワップを回避しようとか、そんなの無駄でしょうか? <環境> CPU=i5 メモリ=8GB OS=WIN7home-64bit EXCEL=2007

  • メモリーや配列変数域にプログラム書きアクセスする

    Visual Studio6(32Bit)ではメモリーや配列変数域にアセンブラーでプログラムコードを直接書き込んでアセンブラーのCALL命令でそのエリアをCPUがアクセス出来たのですが。 Visual Studio8(64Bit)ではエラーになりました。 8でもアクセス可能にする方法を教えてください。

  • クラスの宣言でのメモリ使用サイズの違い

    お世話になります。 現在、Visual Studio 2005にてMFCのC++のプログラムを作成しているのですが、そこでメモリの使用容量について疑問に感じた点があったのでこちらで、質問させて頂きました。 お聞きしたい内容は あるクラス1内で別のクラス2を宣言する際に、メンバ変数としてそのクラス2を宣言し、クラス1のコンストラクタでnewでメモリを確保し、デスクリタでdeleteする方法と、その都度クラス2の変数または関数が必要なときにnewでメモリを確保して、deleteで開放する方法とでは、メモリの確保等で違いがなにかありますでしょうか? また、クラス2をクラス1,クラス3で使用する場合には、クラス1,クラス3でそれぞれクラス2のオブジェクトを宣言するのと、クラス1でクラス2のオブジェクトを宣言し、そのオブジェクトをクラス3でexternするのではどちらの方がメモリの使用等からよい方法なのでしょうか? 今までほとんどメモリを気にせずにプログラムを作っていた為、メモリの使用の点ではほとんど無知な為、変な質問なのかもしれませんが、ご存知の方がいらっしゃいましたら、ご回答をお願い致します。 開発環境は Widows CE 6.0 Visual Studio 2005 です。

  • c++のグローバル変数

    お世話になります c++のグローバル変数の使い方を教えていただけないでしょうか Visual Studio 2008を使用しております ------------abc.cpp------------- int AAA; BBB(){ AAA = 1; } abc::CCC(){ AAA = 2; } コンパイル(ビルド)ではエラーは出ないのですが、 BBBをコールした時は変数AAAに値をセットできるのですが、 abc::CCCをコールした時、AAAに値がセットできません、 ウォッチ等も「エラー:識別子'AAA'はスコープ外です」 となってしまいます。 補足 BBBはリンクしているライブラリ(修正不可)からコールされる為、 クラスに組み込む事が出来ません。

  • C++のソースをライブラリ化すると問題が・・・・・・

    他の人のプログラムをLibにして流用しようとしているのですが, 問題にぶち当たってます. Libで定義されているクラスに, ある情報を取得/格納できるクラスがあるのですが, いざ,そのクラスをインスタンス化し, クラスで定義してあるメソッドを実行してインスタンスのメンバ変数に情報を格納した後に,インスタンスのメンバの情報をメソッドなどは使わずに取り出そうとすると一部の情報が格納されておらず抜き出すことができません. そのクラスにはシングルトンで実装されており,クラスが持っている情報表示用メソッドを実行すると,ちゃんと,格納されてるぽいのですが・・・・・.もちろん,メンバ変数はパブリックです. 唯一違うとすれば,取り出すことができるメンバの型はdoubleで,取り出せないのはVector< (独自の構造体) >という点くらいです・・・・.エラー内容は取り出せないというよりはVectorのメモリが確保されていないような感じです. 当然,Libをexeで起動した場合は正常に動いているます. 何か思いつく原因は無いでしょうか?? 宜しくお願いします!!

  • C# フォームを追加するとエラー

    C# 勉強中の者です。Visual Studio 2008 を使用しています。 既に一つのフォームで実行できているプロジェクトがあり、[プロジェクト]-[Windows フォームの追加]から追加してフォームを2つにしてみようと思いましたが、以下エラーが出てしまいます。 <エラー内容> ファイル内にデザインできるクラスがないため、このファイルのデザイナを表示できませんでした。ファイルの以下のクラスがデザイナで見つかりました: Form2 --- 基本クラス 'System.Object' をデザインできません。 <このエラーのヘルプ> Visual Studio 内のクラスが、画面上でデザインできるクラスから継承されていないため、ファイルのデザイナを開けません。 どうすればフォームを追加することができるのでしょうか? よろしくお願いします。

  • 変数の宣言方法の相違によるエラー

    ある変数を関数内で宣言した場合、デバック時に「ハンドルされていない例外が発生しました」っていうエラーになります。でも、グローバル変数として宣言した場合には、同じエラーが発生しませんでした。今回の場合、配列を10,000,000ぐらい確保しようとしたので、メモリ領域を確保できなかったが、エラーの発生原因だと思います。メンバ変数とグローバル変数で確保できるメモリ領域にどれくらいの違いがありますか。その他にクラスのメンバ変数として宣言した場合とグローバル変数として宣言した場合でどのような違いがありますか。 わかる方が教えてください。よろしくお願いします。

  • Serialize で困ってます!!

    はじめまして。 "Hello world!" を勉強してから半年ほどの C++ 初心者です。 Visual Studio.NET 2003 で MFC でアプリを開発しています。 自作したクラス(これは CObject クラスを継承してます)に Serialize をオーバーライドして,クラスのファイル読み書きを 簡単に行えるようにしています。 MFC は素晴らしいと,初心者ながらに感動しております。 いま Serialize に関する問題に直面しています。 クラスにメンバ(のデータ)を増やしたときのことです。 クラスの Serialize を記述しなおして,正しく動作するようにはなりました。 ところが,(当然ですが)記述しなおす前の Serialize で保存したファイルを読むと 「予期しないファイル形式です」となります。 このような場合に,一般的なエラー回避方法はあるのでしょうか? クラスにメンバをたった 1 つつけ加えただけで,エラーが出て不便に思います。 クラスにメンバをつけくわえることは,アプリのバージョンアップ等でも必要だと思うのですが。。。 初心者につき,間抜けな質問をしているかもしれませんが,ご教授いただければ幸いです。

  • 【C++】メソッドやプロパティの隠蔽

    基底クラスAで、Public でメソッドXと、メソッドYが定義されているとき、 それを継承したクラスBで、何らかの方法でメソッドXと、メソッドYを隠蔽させ、 クラスBを継承したクラスCでは、メソッドXと、メソッドYが使えないようにさせることはできますか? ※Visual Studioで、クラスCの入力サポート(メンバーや、メソッドの入力候補を出してくれる機能)で、 メソッドXや、メソッドYが出ないようにしたいです。 ※同様に、メンバーに対しても、隠蔽化をしたいです。

専門家に質問してみよう