質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Chocolatey

Chocolateyは、Windows向けパッケージ管理ソフトウェアです。Windows上で動作するソフトウェアの依存関係を含め、簡単に更新・インストール・アンインストール・検索を行うことができます。

Kaggle

Kaggleは、機械学習モデルを構築するコンペティションのプラットフォームおよびその運営企業を指します。企業や政府といった組織とデータサイエンティスト・機械学習エンジニアを繋げるプラットフォームであり、単純なマッチングではなくコンペティションが特徴です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

5450閲覧

del、ガベージコレクションしても開放されない

YNN35

総合スコア22

Chocolatey

Chocolateyは、Windows向けパッケージ管理ソフトウェアです。Windows上で動作するソフトウェアの依存関係を含め、簡単に更新・インストール・アンインストール・検索を行うことができます。

Kaggle

Kaggleは、機械学習モデルを構築するコンペティションのプラットフォームおよびその運営企業を指します。企業や政府といった組織とデータサイエンティスト・機械学習エンジニアを繋げるプラットフォームであり、単純なマッチングではなくコンペティションが特徴です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2022/01/13 08:21

編集2022/01/13 08:47

前提・実現したいこと

メモリを開放したい。

発生している問題

Python

1import gc 2import pandas as pd 3 4scores = [] 5for num in range(13):#通貨別にデータを作りそれを通貨別でリストにDFを格納 6 7 train = conv_data(train_list[num]) 8 9 y_train = train['Target'] 10 X_train = train.drop('Target', axis=1) 11 12 del train 13 gc.collect() 14 #ここでも下と同様、開放してもメモリ使用率が減らない 15 16 cv_score = KFold_learn(categorical_features, X_train, y_train, 'xgboost') 17 scores.append(cv_score) 18 19 #ここまでy_trainとX_trainがメモリを多く消費しているのでここでそれを開放する 20 del y_train, X_train, cv_score 21 gc.collect() 22 #この後開放して確かにオブジェクトは消えたがメモリ使用率は変化しない。これを直してしっかり開放させたい。 23 """ 24 import sys 25 print("{}{: >25}{}{: >10}{}".format('|','Variable Name','|','Memory','|')) 26 print(" ------------------------------------ ") 27 for var_name in dir(): 28 if not var_name.startswith("_"): 29 print("{}{: >25}{}{: >10}{}".format('|',var_name,'|',sys.getsizeof(eval(var_name)),'|')) 30 31 で確認すると確かにy_train, X_trainは消せているが、tracemallocを使って確認すると、pandasがメモリを消費しているのがわかる。 32 """

補足情報(FW/ツールのバージョンなど)

Jupyter notebook(kaggle notebook), Python3を利用

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2022/01/13 08:32

ct の定義がないようです。動いているコードですか?
YNN35

2022/01/13 08:47

動いているコードではなく、簡略化したコードです ctは消すの忘れてました。直します。ありがとうございます。
guest

回答1

0

ベストアンサー

こういうご質問は時々ありますが、多くの場合OSの動きとメモリ使用量について測定方法に関して理解していない場合が多いです。

  • OSの動き(メモリ管理)

OSが管理するプロセス空間は、execなどを使って全く新しく書き換えない限り割り当てた仮想メモリが減ることはありません。
ガーベジコレクションは、OSに依頼して割り当てられたメモリを再利用できるようにするだけです。

  • メモリ使用量

メモリ使用量を測定するツールは、プロセスに割り当てられた仮想メモリの量を測定するものと、プロセスの仮想メモリのうち実メモリが割り当てられている量を測定するものがあります。前者はexecなどを行わない限り減少しません。後者は他のプロセスの仮想メモりが多くなると減少することがありますが、それは自身の使うメモリが減ったのとは関係ない場合があります。

なお、CPythonは、参照されなくなったオブジェクトのメモリを自動的に開放していますので、gc.collect()で解放されるのは循環参照されているオブジェクトのメモリだけです。循環参照がなければ、gc.collect()を実行する意味はありません。

投稿2022/01/13 08:59

ppaul

総合スコア24668

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YNN35

2022/01/13 17:09

なるほど。勉強不足でした。メモリ管理についてある程度調べましたが、質問内容についてそこで新たな疑問が生まれました。 for文で1回目のループが終わった段階と、2回目のループが段階での確保されているメモリの割合を比較すると2回目のほうが5%程度増えてしまいます。同様に3回目でまた増えてしまいます。 なぜGCされて、再利用することが可能になったメモリにデータを格納せず、新たな領域を確保してしまうのでしょうか? ついでに、ループが増える毎y_train, X_trainのようなオブジェクトの大きさの増大は計測上ありませんでした。 なにか理解しまちがえていたら申し訳ありません。
ppaul

2022/01/13 23:36

フラグメンテーションのためです。 つまり、freeされてプールに戻ったメモリが、mallocでもっと大きなメモリの要求があったときに利用できないためです。細分化されたメモリをつなぎ合わせる処理は非常に重くなるのでfreeのアルゴリズムでは採用されていないのです。コピー型ガベージコレクションを実装すればそういうメモリをつなぎ合わせることができるのですが、LISP処理系以外で見たことがありません。
YNN35

2022/01/14 05:01

なるほど、、となると解決策は一度最初に大きなダミー配列を作りそれでメモリを確保した後GCしていけばいいのでしょうか?て思いやってみましたが、今度はGCした瞬間にメモリの確保されている割合が何故か減ってしまいました...なにが原因かやはりよくわかりませんし、解決策も見いだせません... ついでにメモリ使用率はpsutil.virtual_memory().percentで計測しています。
YNN35

2022/01/14 10:10

原因がわかりました。 listにdfのオブジェクトを格納していたのですが、変数のメモリ消費量を表示するプログラムに表示されないのが原因でコピーでなく、代入になっていることに気づけませんでした。 ついでにいろいろな勉強になりました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問