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

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

ただいまの
回答率

87.49%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 1,842

score 4

前提・実現したいこと

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

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

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

該当のソースコード

import subprocess

for i in range(1,100000):
    p = subprocess.Popen(['ls', '-l'],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.STDOUT, shell=False)
    out,err = p.communicate()
    print('i: {} out: {}\n'.format(i,out.decode()))
    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が残っている

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Bull

    2020/04/16 16:13

    機種によって現象が違うということは、Windows そのもののあるいはデバイスドライバのメモリーリークということも考えられますね。

    デバイスドライバーが使用いているメモリーはリソースモニターでは確認できないようです。

    Sysinternals に RAMMap (https://docs.microsoft.com/ja-jp/sysinternals/downloads/rammap) というツールがありますが、これですとメモリーの状況が詳細に分ります。
    ただ残念ながら、デバイスドライバが使用してていることは分りますが、具体的なドライバ名までは分らないようです。

    キャンセル

  • adakamakiri

    2020/04/16 18: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

    キャンセル

回答 2

check解決した方法

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

Spyder,JupyterNotebook,Anaconda Prompt

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/04/15 19:07

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

    キャンセル

  • 2020/04/15 19:22

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

    キャンセル

  • 2020/04/15 19:26

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

    キャンセル

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

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る