• ベストアンサー

メモリの解放について

メモリの解放について c#で、Mysqlへデータセットするプログラムを作っているのですが、登録する度にメモリが増加していきます。昔、VC++で同じようなプログラムを作成した時にも同現象が発生したので、SetProcessWorkingSetSize()を使って解決したのですが、c#では、解決する方法はあるのでしょうか? ご教授お願いいたします。

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

  • ベストアンサー
noname#116136
noname#116136
回答No.1

DataSet はレコード操作をSQL 文として保持しています。Update() 時に実行する訳です。 従ってレコード操作の度にメモリを消費してゆくのは当然かと思います。といっても微々たるもんでしょう? まぁソレとは別に、ガーベッジコレクタは必要な時にしか動きません。あなたがメモリ消費について心配しなくてもいいはずです。 #メモリが少ない環境ではそれなりに早めにメモリ破棄が行われますから。ガーベッジコレクタには強制的に発動するメソッド(System.GC.Correct()?)もありますが・・・、これ実際の動作はどうだったかなぁ・・・。 .Net のガーベッジコレクタは今は十分に信頼できるはずですよ。

w0a15455
質問者

お礼

ありがとうございます。 勉強になりました。 心配しないようにします。

関連するQ&A

  • メモリを解放しないとどうなる?

    趣味でプログラムの勉強をしています。 初歩的な質問になると思いますが、よろしくお願いします。 C言語やC++言語のように、動的に確保したメモリを使用後に意識して解放しないといけない言語で、解放の処理をしないままプログラム(アプリケーション)を終了した場合にはシステム(OS?)的にはどのような状態になるのでしょうか? 例: ・malloc して free しない ・new して delete しない 確保されたメモリ領域がそのまま残り、システムとして使用できるメモリ量が減る(解放にはPCの再起動が必要)のでしょうか? それともアプリケーションの終了時に自動的に解放されるのでしょうか? Windowsの場合を想定してご回答いただだけると嬉しいです。

  • メモリ解放について(ASP)

    お世話になります。 VBscriptを利用したASPプログラムを作っています。 そこで、メモリ解放について質問があります。 set 変数 = nothingで解放を行おうとおもいますが、 これを使った方が良い変数(オブジェクト変数)と使っても意味がない、もしくは使ったらエラーになる変数というのは、何で判断すればよいのでしょうか? とりあえず、メモリリークを避けたいからすべての変数とオブジェクト変数をプログラムの最後で解放しようと思ったのですが、どうもエラーになる変数もあるようなので質問しました。

  • mallocで確保したメモリをfree解放する必要

    当方、C言語を勉強中です。 mallocで確保しておいたメモリをfreeで必ず解放するようにと教わりました。 freeで開放しないことをひどく野蛮な言葉で例えられたのですが、それほどまでに必要である実感が実はあまりありません。 ファイルポインタでファイルを開いているときに、プログラムが終了すると開いているファイルを自動的に閉じるように、プログラムが終了すると自動的に解放されるものと思っていたのですが、やはりこちらはプログラム終了後も確保されたままになってしまうのでしょうか。 また、解放しないことによるデメリットで、メモリを圧迫する以外にはなにがあるのでしょうか。 ご教授おねがいします。

  • ExcelのVBAでメモリ解放できない

    以下のようなプログラムで、ExcelVBAで作成しております、Webの情報を取得しております。 strGetUrl のところのサイトによっては、メモリが解放できず困っています。 Whileで繰り返すほど、メモリを消費して解放されません。メモリいっぱいになれば解放してくれるのかと思いましたが、止まってしまいました。2回目はOSを壊して再インストールしてもらいました(VPS上で)。 困っております。オブジェクトも”Set xxxx = Nothing”で解放しているつもりです。 考えられる理由をご教授頂けると幸いです。 環境は OSはWindowsServer2008R2 IEはIE8 でVPSなので変更不可と言われました。 ちなみに、Windows8.1の環境ではメモリが溜まっていくことはなかったです。 何か良い方法はありますでしょうか? また、別のWebアクセス方法はありますでしょうか? IE = CreateObject("InternetExplorer.Application")は同じ結果でした。 以下のプログラムでサイトにもよりますが、発生しています。 *********************************** Option Explicit Sub testHtml() Dim doc As Object, objTag1 As Object, objTag2 As Object Dim oHttp As Object Dim strUrl As String, strGetUrl As String Dim rowIndex As Integer ' 基本URL設定 strGetUrl = "http://www.xxxx.xxx.com" rowIndex = 1 '1列目が1行づつ進めてが空になったら終了 While Cells(rowIndex, 1).Value <> "" Set oHttp = CreateObject("MSXML2.XMLHTTP") Set doc = CreateObject("htmlfile") ' *************** HTTPヘッダの作成し、送信してデータを取得 ***************** With oHttp .Open "GET", strGetUrl, False .Send ' 受信したデータをオブジェクトに書き込みます。 doc.Write .responseText End With ' *************** 受信データを解析し、H2データ取得に分割 ***************** For Each objTag1 In doc.body.getElementsByTagName("H2") If objTag1.className = "resultCount" Then Cells(rowIndex, 2).Value = objTag1.innerText End If Next ' Objectの解放 Set objTag1 = Nothing Set objTag2 = Nothing Set doc = Nothing Set oHttp = Nothing rowIndex = rowIndex + 1 Wend End Sub

  • インスタンス破棄時にメモリが解放されるようにしたい

    C++言語でプログラムを作成しています あるクラスでインスタンス生成時に動的にメモリを割り当てた後 インスタンスが破棄されるまでそれを使用し インスタンス破棄時に解放するにはどうしたらいいでしょうか デストラクタで解放処理を実装すると 明示的にデストラクタが呼ばれた際に解放されてしまい インスタンスが破棄されるまで使用できませんでした

  • Linuxのメモリ解放処理

    質問内容を下記にまとめてみました。 どなたかお詳しい方、ご回答下さいませんでしょうか。 情報ソースへのリンクでも構いません。よろしく お願いします。 【環境】 PCサーバ;PentiumIII 1GHz*2、2GB SDRAM、60GB*3 HDD(RAID5;記憶領域約120GB) Redhat Linux7.1J Oracle 8i for Linux(8.1.7) 【現象】 OS起動時からRAMをほとんど開放せず、処理の度にHDDから読み込んだデータをRAM上に展開し続けている。 残りの空きメモリが4MBを割り込んだ辺りから空きメモリの減少が止まる。問題なく処理は続行されている。 この間、約2GB確保されたスワップ領域は全く使用されていない。 以上は、Oracle上でPL/SQL及びCのプログラムを実行している際に確認された。 【仮説】 ・Linuxは可能な限りメモリ上にキャッシュを残す仕様となっていて、残り空きメモリが一定の水準以下になるタイミングになって初めて割当済みメモリを解放しているのではないか。 【疑問】 1.割当済みメモリ解放の閾値の設定はどこで行っているのか 2.スワップ領域が使用されていないのはなぜか

  • Excel2007マクロでメモリが増加し続ける

    Excel2007でVBAでマクロを組み込んだところ、 クリックイベントが走る度に、仮想メモリが増加し続けるようになってしまいました。 シート上にActiveXコントロールを配置し、 ActiveXコントロールのクリックイベントプロシージャに VBAでマクロを組み込んでいます。 内部で使っているオブジェクトは、 きちんとNothingで解放しています。 マクロを組み込むと必ず発生する現象ではなく、 シート上に配置しているコントロールの数、 ブックのシート数、 モジュールの数、ステップ数、 イベントプロシージャの処理ステップ数、 などのオブジェクトの量が多くなると、 仮想メモリが増加し続けるという現象が起きるようです。 オブジェクトの数、サイズによっては、 1クリックで50Mくらいずつ増加することもあり、 すぐにメモリリークしてしまいます。 XP+Excel2007の環境でのみ発生します。 Vistaでは発生しません。 SPはそれぞれ、XP SP2、Excel 2007 SP1です。 なぜ、このような現象がおきるのでしょうか?

  • メモリリークのデバッグ

    プログラムの実行時にエラーで停止してしまいます。 数値計算系のプログラムで反復計算を行っています。 数万回反復させても大丈夫なのに100万回くらい反復 計算するとプログラムが停止します。 場合によりパソコンがフリーズします。 メモリ関連が原因であることは想像できるのですが デバッグの方法がわかりません。計算の途中にでてくる 関数等でつかわれている変数でmallocしたものは全て 解放しているつもりですがどこかおちがあるのかもしれません。オチがある場合どこを解放しわすれているのか 現在つかめていません。 VCをつかっているのですがデバッガを使って実行途中の メモリの状態を確認する方法など、この問題を解決する 為に有効であると思われる方法をご存じでしたら教えて ください。 windows2000 visualC++6.0professional メモリ256MB

  • メモリの確保

    C++で倒立振子のプログラムを書いている者です。 現在、思考回数を500でやらせるために、500の配列を用意してやっているのですが、この思考回数を500以上にすると、コンパイルは通るのですが、実行画面が出てすぐ消えてしまう現象が起こってします。おそらく、メモリが足りないのだと思い、mallocを試してみたのですが同じ現象が起きてしまいましい、どうようにして解決していいのかわかりません。宜しくお願い致します。

  • C言語で、メモリを解放しないで終わるプログラム

    C言語の話です。 mallocなどで領域を確保したら、解放しなければいけないんですよね。 しかし、解放しないで終了すると具体的にどうなるのか、私は理解していません。 次のような、freeしないプログラムを作って何回か実行してみました。しかし、別におかしくならないですね。 #include <stdio.h> #include <string.h> #include <stdlib.h> char *cp; int main(void) { unsigned int n; printf("サイズ(2以上)を入力してください:"); scanf("%d",&n); cp=malloc(n); if(!cp) { printf("%s\n","mallocできませんでした。"); return(1); } strcpy(cp,"A"); printf("cpは%sです。\n", cp); printf("それでは終わりにします\n"); return(0); } グローバルでcharの固定長の配列を宣言したとすれば、プログラムの終了時にその領域は解放されると思います。 このような固定長の配列の場合とmallocの場合との違いが問題なんです。  実験的に、解放しないがために何かおかしくなってしまったり、悪影響を及ぼしたりするようなプログラムを作りたいんですが、どのようにすればよいでしょうか。 もしも私の環境ではそのようなプログラムが作れないなら、別の環境の話でもよいので具体的にこんなふうになってしまうという話をお聞きしたいんです。 過去の質問を検索してみました。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=160037 ここのNo.9では、「freeしないアプリケーションの起動・終了を繰り返すと、リソースが不足する」旨が書かれていて、質問者の方もそれで納得されているようです。 しかし、私は、リソースが不足するとはどういうことで、何が起こるのか、知りません。 私のマシン OS:Windows98SE VC++6.0

専門家に質問してみよう