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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python 3.x

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

Q&A

解決済

2回答

5800閲覧

Python3(Anaconda, Windows10)でsubprocessのPopenがメモリを解放しない

adakamakiri

総合スコア4

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python 3.x

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

0グッド

2クリップ

投稿2020/04/14 13:39

編集2020/04/16 14:23

前提・実現したいこと

Windows10でAnacondaをインストールし,python3の環境で開発しています.
Pythonのsubprocessを使用して外部プログラムを実行して結果を処理する,ということを何度も繰り返すコードが必要になり,作成したものの,メモリを消費し続け,解放されないという現象に悩まされています.
ターミナルを終了させても,一向にメモリが解放される様子はありません.
この問題を解決し,メモリが正常に開放されながら実行されることを目指しています.

発生している問題・エラーメッセージ

問題の原因を追究した結果,添付のコードで同じ問題を起こすことができたため,Popenの部分で発生している,ということまで分かっています.
※実行する外部プログラムはlsを使用していますが,これに意味はありません.
このコードをPC再起動直後のメモリ使用率22%のときに実行すると,終了後にはメモリ使用量57%となり,ターミナルを終了させてもメモリは解放されませんでした.
(CPU Ryzen 7 3700X,メモリ16GBの環境です)

該当のソースコード

Python

1import subprocess 2 3for i in range(1,100000): 4 p = subprocess.Popen(['ls', '-l'],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.STDOUT, shell=False) 5 out,err = p.communicate() 6 print('i: {} out: {}\n'.format(i,out.decode())) 7 p.terminate()

試したこと

この問題は,Spyder,JupyterNotebook,Anaconda Promptのうちどれを使用しても発生しました.※上記のメモリ増加率はAnaconda Promptのときのものです.
調べた情報の中には,shell=Trueだとプロセスを終了できなくなった,という内容[1]がありましたが,今回はshell=Falseで発生しています.

[1] How to terminate a python subprocess launched with shell=True,
https://stackoverflow.com/questions/4789837/how-to-terminate-a-python-subprocess-launched-with-shell-true, ※2020/4/14に閲覧

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

Pythonのバージョンは 3.7.4,condaのバージョンは 4.7.12 です.

2020/4/15 追記
Ubuntu 18.04にAnacondaをインストールし,再起動後このプログラムを動かした場合,このメモリが開放されない問題は発生しませんでした.なので,Windows10でのみ起きるものと推測されます.(CPU A10-7800 メモリ12GB,python 3.7.6,conda 4.8.2)

2020/4/15 追記
Windows10でこのプログラムを2回実行した際のリソースモニターを含めたスクリーンショット(※画面左のショートカット部分はカットしています)はこちらです.
※実行しているmemory_explosion.pyの中身が上記コードです.
リソースモニターでコミット順に並べた際にはバックグラウンドで動いているskype,steamなどが上位に来ますが,何か莫大にメモリを消費しているプロセスは見当たりません.このときは1回目終了時57%→2回目終了時88%となっています.ls.exeは実行中は下の方に現れますが,終了後は無くなります.しかし,メモリは消費されたままです.
Window10で2回実行した後のスクリーンショット

2020/4/15 追記
上で示したスクリーンショットでは,ワーキングセットを見ていなかったため,再度2回実行した際に,ワーキングセットでソートしたものを示します.
Windows10で2回実行した後のスクリーンショット(ワーキングセット)

2020/4/15 追記
ノートPCのWindows10でこのプログラムを実行したところ,メモリの開放に不具合は起きませんでした.
実行環境:CPU i7-8550U,メモリ 16GB, Python 3.7.6,conda 4.8.2
Windows10で,というよりはハードウェア構成から起因している問題の可能性も出てきました.

2020/4/16 追記
AnacondaとPythonのバージョン違いが原因かもしれないので,メインPCの環境を更新して実行しました.
実行中,じわじわとメモリ使用率が増えていき,1回実行前後では物理メモリ使用率は35%→65%となり,終了後も変化しないため,バージョンが古いという点は問題ではありませんでした.
実行環境:CPU Ryzen 7 3700X,メモリ16GB,Python 3.7.7,conda 4.8.3

2020/4/16 追記
RAMMapを使用して,開始前(メモリ使用率33%),1回目終了時(メモリ使用率65%),2回目終了時(メモリ使用率94%)の各時点で更新し,内容を見ました.
Page Tableが実行するごとに約2.7GB増加しているほか,Unusedなのにアクティブなメモリというものが増加しています.Diver Lockedにはほぼ変化はありませんでした.
RAMMap実行結果

2020/4/16 追記
リソースモニターでは,終了後ls.exeは消えていきましたが,RAMMapを終了後に起動してProcesesを見ると,ls.exeは大量に残っていました.これらのls.exeがPage Table分のメモリを保持したままになっているようです.
また,セーフモードで起動してプログラムを実行した場合,メモリ解放の問題は発生せず使用率は10%台のままでした.
ls.exeが残っている

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

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

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

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

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

Bull

2020/04/16 07:13

機種によって現象が違うということは、Windows そのもののあるいはデバイスドライバのメモリーリークということも考えられますね。 デバイスドライバーが使用いているメモリーはリソースモニターでは確認できないようです。 Sysinternals に RAMMap (https://docs.microsoft.com/ja-jp/sysinternals/downloads/rammap) というツールがありますが、これですとメモリーの状況が詳細に分ります。 ただ残念ながら、デバイスドライバが使用してていることは分りますが、具体的なドライバ名までは分らないようです。
adakamakiri

2020/04/16 09:47

RAMMapを教えていただき,ありがとうございます. 早速使用しまして,結果から分かったActiveなUnused memoryが増えることを調べると,何らかのドライバが原因である可能性が高いことが下記ページから分かりました. その後セーフモードでプログラムを回してもメモリが増加していかなかったため,ドライバが黒である可能性が高まっています.引き続き検証を続けます. Memory problem with unreleased "Unused" memory, https://answers.microsoft.com/en-us/windows/forum/all/memory-problem-with-unreleased-unused-memory/20e41e26-9223-4108-96a2-0364df410fa9
guest

回答2

0

自己解決

本日,メインで使用していたPCのWindows10を入れていたSSDが壊れたため,HDDにWindows10をクリーンインストールした後で再度試すと,メモリ解放の問題は発生しませんでした.
(※実行するプログラムをlsからdirに変えたりなどの変更あり,Python 3.7.6,conda 4.8.2)
元の環境が失われてしまったので,質問を閉じさせていただきます.

何らかのドライバによる影響もしくはSSD不調の影響でメモリが解放されない状況が起きる場合があり,
クリーンインストールもしくは不調なSSDを外したことでそれが解決した,ということになります.

検証方法などでアドバイスをいただき,ありがとうございました.

投稿2020/07/17 12:58

adakamakiri

総合スコア4

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

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

0

Spyder,JupyterNotebook,Anaconda Prompt

どれも使ってないので、生のPython3.8.2でやってみましたが、なんともないですね。
実行中は物理メモリ使用量が200~400MB位増えて実行が終わるとほぼ戻ります。

プロセス毎のプライベートワーキングセットサイズやコミットサイズを見て、どのプロセスがメモリを使っているか、調べてはどうでしょうか?

投稿2020/04/14 15:43

otn

総合スコア84559

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

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

adakamakiri

2020/04/15 05:16

実行と回答ありがとうございます. otn様の実行環境はWindows10でしょうか?本文に追記しましたが,本日サブPCのUbuntuにAnacondaをインストールした環境ではメモリ開放が上手く行われることを確認しました. Windows10のリソースモニターは私も見ているのですが,コミットサイズが大きいものは実行中も浮上して来ず,下の方でls.exeが灰色で並んで消えてを繰り返している状態です. ただメモリ使用量が上がっていくのみで,何が使用しているのかはリソースモニターからは見ることはできませんでした.
otn

2020/04/15 08:50

Windows10です。 曖昧なまま進んでるので、確認ですが、見ているのは物理メモリ量でしょうか?仮想メモリ量でしょうか? どのツールのどこの数字を見ていますか? プロセスごとの物理メモリを見るならワーキングセットだし、仮想メモリを見るのならコミットサイズです。 Pythonプロセスやlsプロセスは終了しているのでメモリを使いようが無く、使っているとすれば開発ツールです。lsプロセスが死にきっておらずたくさん生きていると言うことでは無いのですよね?
adakamakiri

2020/04/15 10:07

回答ありがとうございます. 追記情報ではリソースモニターのコミットサイズを見ていましたが,物理メモリ量のワーキングセットを見るべきでした.失礼いたしました. 2回実行後のワーキングセットを見ると,Memory Compressionが220MBほどを使用していますが,他に大規模に使用しているプロセスはありませんでした. lsプロセスはプログラム終了後のリソースモニターには表示されませんが,これらがゾンビになっているかどうかをWindows10で確認する方法はありますでしょうか.
otn

2020/04/15 10:22

プロセス一覧になければ終了しています。 Linuxでいうゾンビプロセスも生きてるプロセスなので、ちゃんとpsに出てきます。
otn

2020/04/15 10:26

数秒ごとに、プロセス一覧と、それぞれのワーキングセット、プライベートワーキングセットの量を取得して記録し、後で調べるのでしょうか。 Pythonと並行で動かせば良いので、それらが簡単にできる言語を使えばいいかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問