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

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

ただいまの
回答率

90.48%

  • Python

    8603questions

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

  • Windows

    1495questions

    Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

  • Tkinter

    166questions

    Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

  • メモリリーク

    47questions

    メモリリークは、プログラムファイルがメモリの解放に失敗した時に起こります。

WindowsXP/7では仮想メモリ量が増えるがWindows10では増えない

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,837

sin_250

score 25

Windows XPおよびWindows 7では、自作のPythonプログラムを動かすと
タスクマネージャの仮想メモリ欄が(頻繁に増えたり減ったりしつつ)長期的には徐々に増えていくので
何故だ???と頭を悩ませていたのですが、Windows 10で同じプログラムを動かすと、
仮想メモリ欄、その他メモリ関係の数値はピクリとも変わらず一定です。
(Windows 10ではコミットサイズという名前になっていますが)

タスクマネージャで表示される仮想メモリの数字は、実際にプロセスが使用している
数値ではなく、OSが各プロセスに将来使用するかもしれない分なども含めて予約的に割り当てている数値だと理解しています。

当プログラムは長期的に(3か月以上)連続運転したいものなのでメモリリークがあったらまずいなぁと
悩んでいたのですが、結局これはWindows XP, 7のメモリ割り当て管理が下手くそなだけで致命的な障害にはならないだろう、という理解をして問題ないでしょうか。

なおXPでは起動時の仮想メモリは約20MBで、ちょうど12時間で2.6MB増えました。

アドバイスいただけたら幸いです。
なお、私のWindows XP, 7環境では以下のような超簡単なプログラムでも仮想メモリ量は微増していきました。
一体全体、どういう理由なのかわかりません。

from tkinter import *

class Sample:
    def __init__(self):
        self.root = Tk()
        self.cnt = 0

        self.label = Label(self.root, text = str(self.cnt))
        self.label.pack()

        self.root.after(100, self.rewrite)

    def rewrite(self):
        self.label.configure(text = str(self.cnt))
        self.cnt += 1
        self.root.after(100, self.rewrite)
#-------------------------------------- Start Main
if __name__ == "__main__":

    sample = Sample()
    sample.root.mainloop()
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+4

 メモリリークは、不安ですよね、、、

私もWindowsサービスで、1年連続動作させてくれ!みたいな話で、結構がっつりと試験に時間をかけたことがあります。

私がメインでWindowsサービスに関わっていた時には、メモリの確保、破棄(new, deleteとか、malloc,freeとか)の確保サイズや確保時間などによって、しばらくはメモリが増加していく傾向だが(実際に確保している量よりも多く)ある程度で天井になるパターンとか、のこぎり状に、ある程度まで線形的に上がって、ストンと落ちるパターンとか、いくつかのパターンがありましたが、

どちらにしても、総じて、実際に確保している量よりも多めに確保されているのが実際です。

OSのヒープ管理の状態にもよりますが、細かいメモリを、new、deleteする度にメモリを割り当て、解放していたのでは、メモリ上のフラグメントが激しくなり、効率が落ちてしまうため、ある程度無駄を覚悟で連続的にメモリを確保し続けて、解放である程度大きなブロックができたら、OSに返却するという動作をしていると思われます。

また、このメモリの確保、解放の動作については、OSの種類や、使っているベースソフト(Python、JavaScript、C++&MFC、PHP・・・etc)によってそれぞれ実装が違うので、環境によって見た目のメモリの増減がちがってきます。

 さて本題です。

メモリリークの判断ということですので、以下を参考に見られるとよいかと思います。

 プライベートワーキングセットを見ましょう

タスクマネージャのワーキングセットとかの数値は、さまざまな要素(他にロードしてるモジュールなんか)の関連もあるので)いまひとつ、ぼやっとしてしまいますので、ここは、メモリ(プライベート・・・)とか、
パフォーマンスモニタの、Process > PrivateBytes > 対象のプログラム、で長時間監視をしてみてください。

パフォーマンスモニタならCSVに吐き出せますので、可能であれば加速テスト(通常より多くの処理を走らせる)を行って、みてください。メモリリークしていれが、この値は確実に増加していきます。

この部分で、「自分の」プログラムがある程度リークしていない保証がとれます。

しかし、プライベートワーキングセットは落ち着いていても、プライベートではなく「ワーキングセット」が、もりもり増加をしていく可能性があります。これは、他でロードしているモジュールなど、自分で書いたプログラム領域では無い部分で、リークしている可能性を示しています。このあたりも見ておいた方がよいです。

ただし、先にも書きましたとおり、ある程度増加後、天井を打つようなら、それはリークではない可能性があります、このあたりは実際のプログラムの動作がわからないと、なんともですが。

 リークは、メモリだけではありません、リソースリークも見ましょう

こちらは、手っ取り早いのは、タスクマネージャで見られます(パフォーマンスモニタでも見られますので、上記のPrivateByteと一緒にログをとるのが楽です)。

  1. ハンドル数
  2. スレッド数
  3. USERオブジェクト数
  4. GDIオブジェクト数

この4つは、確実に見ておいた方がいい数値です。それぞれ徐々に増えていって減らないようであれば危険です。
※この数値は、Windows10では、タスクマネージャでは見られない?のかな?パフォーマンスモニタで確認しないといけないかもしれません。

少々長文になりましたが、パフォーマンスモニタで、すこし長い時間見てみるのがよいかと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/04/10 23:36

    とても詳細なご回答、まことにありがとうございました。
    色々とプログラム構造を試してみたところ、仮想メモリが微増しないような構造を見つけることができました。
    また、パフォーマンスモニタでのログ取得はアドバイスに従ってやってみて、それで効果ありのグラフを取ることができました。
    ありがとうございました。

    PS
    プログラムを変えてみて効果があったのは、
    変更前:メインスレッドから派生した子スレッドでGUIのモジュール(tkinterの関数)を使っていた
    変更後:tikinterの関数操作はメインスレッドに限定した。子スレッドのデータをGUIで必要な場合はqueueを使ってデータをやり取り。

    何故メインスレッドに限定すると効果があるのかは不明ですが。。。

    キャンセル

関連した質問

  • 受付中

    字下げについて

    お世話になります 本日マイナビ第26章を勉強しております http://news.mynavi.jp/series/python/026/ この中でどうしてもコマンドの字下げ

  • 解決済

    PHPのマジックメソッドのPython版

    PHPのメソッドに未定義な関数の呼び出しやプロパティの設定・取得が行われた時に、PHPから呼び出してくれる(いわゆるコールバックしてくれるマジックメソッドがあります。 #!/

  • 解決済

    Pythonのthreadingにおける、終了時の処理

    前提・実現したいこと Pythonを使って、動画や画像を表示するGUIを作っています。その中で、みなさまのご支援を頂ながらカメラの画像を取り込んで再生できるところまで来ました。

  • 解決済

    Tkinter で動作をイベントとして登録する方法

    プログラミング初学者です 音楽プレーヤーをtkinterを使って製作しているのですが ボタン押すと新しい子ウィンドウが作成され、子ウィンドウが出ている間はボタンをDISABLE

  • 解決済

    pythonのプログラムの変数の扱いがよくわかりません

    ・現在、私はpythonのtkinterを使って、いつどこで何をしたかみたいなのをランダムで選んで表示するプログラムを作ろうとしています。 ・自分の認識が間違っているかもしれな

  • 解決済

    reshapeに関してのエラー

    参考サイトを参考に実装しようと考えています。 https://qiita.com/uni-3/items/a62daa5a03a02f5fa46d ## train.py im

  • 解決済

    【Python】クラスの継承について

     前提・実現したいこと ・Python ・継承 ・super().の使い方 ・作成したクラスへの属性の追加  該当のソースコード class Pokemon: def

  • 解決済

    Python3 tkinter whileループを開始するとボタンが押せなくなる

    参考にした質問と回答:Python3のtkinterで並行処理?を行いたい 参考にしたサイト:簡易ストップウォッチを作ってみた @Python3 似たような質問で恐縮です。 上

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

  • Python

    8603questions

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

  • Windows

    1495questions

    Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

  • Tkinter

    166questions

    Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

  • メモリリーク

    47questions

    メモリリークは、プログラムファイルがメモリの解放に失敗した時に起こります。