- PR -

メモリの解放をしたい。

投稿者投稿内容
武史
ベテラン
会議室デビュー日: 2007/09/21
投稿数: 71
投稿日時: 2007-12-26 09:36
現在、VB 2005 でプログラムを作っているのですが、
その中で、外部のプログラムで大量にメモリを使用する処理があります。

VB でも、直前まで大量のメモリを使用する処理があり、
外部のプログラムに渡すデータをファイルとして作成した後で、
それらのメモリを解放したいと思います。

そのような場合、GC.Collect ではなく、実際に物理メモリをある程度解放する
処理を明示的に動かす方法は何かないものでしょうか?
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-12-26 10:21
CとかC++でやればいいんじゃないの。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2007-12-26 10:26
マネージドなリソースを明示的に開放する手段は無い筈です。

逆に言えばアンマネージドなリソースとしてAPIなどでメモリ確保をおこなえば、明示的に開放できます。ただしその為には既存の処理を大幅に書き換えることになるので、現実的じゃありませんね。最初からそのつもりで設計実装していれば、どうと言うことの無い話なんですけどねー。
武史
ベテラン
会議室デビュー日: 2007/09/21
投稿数: 71
投稿日時: 2007-12-26 11:00
ぶさいくろうさん、甕星さんありがとうございます。

要は、自分で管理しなきゃできんってことですね。

甕星さんのおっしゃるように、API でメモリを確保して、
そのメモリ上を読み書きするように、
プロパティを作ろうかなぁと考え始めたのですが、
メモリを大量に使う VB のロジックを別 exe にする事を
思いつきました。

これなら、起動は遅くなりますが使用したメモリは確実に
解放されますんで。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-12-26 15:12
引用:

VB 2005 でプログラムを作っている





引用:

外部のプログラム



は別のプロセスとして実行されるんでしょ?

であれば、前者のプログラムでいくらメモリを使っていようとも、後者のプログラムのメモリ使用に直接的な影響を与えることは原則ありません。

# 極端に実メモリが少なければスラッシングが発生するかもしれませんが、それは環境がよくないということで。

なので、

引用:

そのような場合、GC.Collect ではなく、実際に物理メモリをある程度解放する
処理を明示的に動かす方法は何かないものでしょうか?



なんて操作をしてもほとんど関係ありませんよ。

疑問があるようなら

・仮想記憶
・プロセスヒープ
・CLRのメモリ管理

などについて上から下まで勉強してみてください。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-12-26 19:39
引用:

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

VB 2005 でプログラムを作っている





引用:

外部のプログラム



は別のプロセスとして実行されるんでしょ?

であれば、前者のプログラムでいくらメモリを使っていようとも、後者のプログラムのメモリ使用に直接的な影響を与えることは原則ありません。

# 極端に実メモリが少なければスラッシングが発生するかもしれませんが、それは環境がよくないということで。

なので、

引用:

そのような場合、GC.Collect ではなく、実際に物理メモリをある程度解放する
処理を明示的に動かす方法は何かないものでしょうか?



なんて操作をしてもほとんど関係ありませんよ。

疑問があるようなら

?仮想記憶
?プロセスヒープ
?CLRのメモリ管理

などについて上から下まで勉強してみてください。



物理メモリと書いてあるので、Windows2000 の頃まで流行った、メモリ クリーナーとか、スイーパーとか、デフラグとか、そういうイメージなのではないかと。

Virtual PC が、物理メモリの空きを要求しますが、そのように、物理メモリに空きが有ったらそこが使われるだろうから、速くなるんじゃない?って方向かと思います。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2007-12-26 21:03
引用:

Virtual PC が、物理メモリの空きを要求しますが、そのように、物理メモリに空きが有ったらそこが使われるだろうから、速くなるんじゃない?って方向かと思います。



そうですかぁ?

GC.Collect() なんかで物理メモリが解放されると考えてるとしたら、それこそ大間違いじゃないですか?

物理メモリを管理しているのはOSであって、CLRはまったく関与してないじゃないですか。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-12-26 22:00
引用:

渋木宏明(ひどり)さんの書き込み (2007-12-26 21:03) より:
引用:

Virtual PC が、物理メモリの空きを要求しますが、そのように、物理メモリに空きが有ったらそこが使われるだろうから、速くなるんじゃない?って方向かと思います。



そうですかぁ?

GC.Collect() なんかで物理メモリが解放されると考えてるとしたら、それこそ大間違いじゃないですか?

物理メモリを管理しているのはOSであって、CLRはまったく関与してないじゃないですか。



ああ、訂正しておこう。「方向かと思います」→「勘違いかと思います」
ええ。この間、Java のほうでほぼ同じ話がありましたが、CLR という魔法の箱が何をしているのか、わかりにくいのかな、と。

そこの理解を促すのは Microsoft の責任なのか。あるいは、まず理解してから使わない開発者の責任なのか。
後者のような気がするんだけどなぁ。。。
(これくらい書いておけば、質問者も気がついてくれますかね?)

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