- PR -

メモリの解放をしたい。

投稿者投稿内容
武史
ベテラン
会議室デビュー日: 2007/09/21
投稿数: 71
投稿日時: 2007-12-27 10:18
いろいろとありがとうございます。

今回の件ですが、次の3つの部分でイメージしてもらえればと思います。

UI部:VB 2005 で作成、メモリは数十M程度利用
処理1:VB 2005 で作成、メモリは搭載メモリのほとんどを利用
処理2:exe で存在。メモリは搭載メモリのほとんどを利用

このような状態ですので、処理1で使用したメモリを解放しないと、
処理2でメモリを確保すると、メモリが不足して大変な状態になってしまいます。

それで、当初のような質問とさせていただきました。

そして、いろいろとアドバイスをいただいた結果、処理1を別 exe とすることに
いたしました。
まるく
大ベテラン
会議室デビュー日: 2004/01/09
投稿数: 181
投稿日時: 2007-12-27 10:29
もうクローズしているようなので、いいんですけど、そもそもそんな大量のメモリを必要とする処理って一体。。。

#少し気になるというか興味が。
#適切な処理分割ができないものなんでしょーか?

渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-12-27 11:33
引用:

そして、いろいろとアドバイスをいただいた結果、処理1を別 exe とすることに
いたしました。



なんじゃそりゃ。

「外部のプログラム」って、同一プログラムのことだったのか。
なんと紛らわしい。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-12-27 12:18
引用:

渋木宏明(ひどり)さんの書き込み (2007-12-27 11:33) より:
引用:

そして、いろいろとアドバイスをいただいた結果、処理1を別 exe とすることに
いたしました。



なんじゃそりゃ。

「外部のプログラム」って、同一プログラムのことだったのか。
なんと紛らわしい。


紛らわしいというか事実と異なるって感じですな。ひどりさんカワイソスw

ぶっちゃけメモリ食う処理をネイティブなC/C++であつかったら?って気がする。
俺は画像処理関係はそうしている。C/C++でしか使えないものも多いし。
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2007-12-27 12:36
引用:

渋木宏明(ひどり)さんの書き込み (2007-12-27 11:33) より:
引用:

そして、いろいろとアドバイスをいただいた結果、処理1を別 exe とすることに
いたしました。



なんじゃそりゃ。

「外部のプログラム」って、同一プログラムのことだったのか。
なんと紛らわしい。



ん?最初の投稿に出てくる外部のプログラムは処理2のことじゃないですか?

<<当初の構成>>
○プログラムA
UI部:VB 2005 で作成、メモリは数十M程度利用
処理1:VB 2005 で作成、メモリは搭載メモリのほとんどを利用
○プログラムB
処理2:exe で存在。メモリは搭載メモリのほとんどを利用

(1)プログラムA→プログラムB
のように呼び出し



<<本スレで辿り着いたスレ主の結論を踏まえた変更後>>

○プログラムA
UI部:VB 2005 で作成、メモリは数十M程度利用

○プログラムA'
処理1:VB 2005 で作成、メモリは搭載メモリのほとんどを利用

○プログラムB
処理2:exe で存在。メモリは搭載メモリのほとんどを利用

(1)プログラムA→プログラムA'
(2)プログラムA→プログラムB
のように呼び出し

のように私は理解しました。
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2007-12-27 13:08
るぱんです

真横ですいません。

Set ○○ = Nothing
って一文で何とかなるって理解で合ってます?

XMLとか解析したりすると、これでたいていはかたがついたのですが・・・。汗
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-12-27 13:47
引用:

Set ○○ = Nothing
って一文で何とかなるって理解で合ってます?



実用上、それでオッケーな場合は多いですが、厳密には「それで万全」である保証はありません。

すべての参照を失ったクラスインスタンスはGC対象となり得ます。

ですが、参照を失った瞬間にただちにGCが実行されるわけではありません=インスタンスを構成するのに利用されていたメモリがすぐに別の用途に使える保証はありません。

GCがメモリを再利用可能な状態に戻すペースよりも速く、新たなメモリ確保が必要となるシナリオでは、OutOfMemory 例外が発生する可能性があります。

そういう状況が起こりえるほどのペースで大量のメモリを消費する場合、設計・開発段階から綿密な計画と計測を行いながら調整しておかないと、現場で泣きを見ることになります。

今なら、64bit OS に移行してしまう、というのも手だと思います。
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-12-27 14:05
僕も CLR のメモリ管理についてはぜんぜん詳しくないというかわからないんですけども。
ちょっと僕の理解を書き出してみますね。

コード:

--- は空きメモリ領域
### は.NETが確保していて処理に使われているメモリ領域
+++ は.NETが確保しているが実際には使われていない領域(ヒープ?)

だとして。

メモリが完全に空いてる状態をこうだとすると
|----------------------------------------|

「直前まで大量にメモリを使用する処理」の時点ではこう
|##############################----------|

上記処理が終わったあとでGC.Collectしたらこう?
|##########++++++++++++++++++++----------|


で、スレ主は +++ の部分をどうにかして空けることはできないの?という
ことを言っているのだと思っていました。
.NET が専有するんじゃなくて、OS に返還できへんの?と。
なので、Jitta さんの「メモリ クリーナーとか以下略」はそういうことを
指しているのだ、と思ってたんです。

なにかしら間違ったことを書いているような気がうすうすとしてくるわけ
ですが、あくまで「スレ主がこう思ってるんじゃないか」的な僕の勝手な
想像です。気持ちはわからないでもないですが。

個人的には上記のような状態になったとしても、メモリをガンガン確保する
プロセスがいたら +++ の部分も解放されるんじゃないのかなと思ってたの
だけど、違うのかしら。メモリクリーナーとかってそういう原理なのじゃ
ないかな?と。
# この辺も僕のつたない知識でしゃべっているのでお気になさらぬよう。
# でも変なこと言ってたら見てる人を混乱させるといけないのでツッコミ歓迎
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。

スキルアップ/キャリアアップ(JOB@IT)