CPUとメモリ消費量の3次元グラフをぐりぐり動かす

matplotlibの3次元グラフ描いてみたい!そしてグラフをアニメする機能があるらしいのでぐりぐり動かしたい!

1. WindowsでCPUとメモリの消費量を取得する。

ぐりぐりリアルタイムで動かすデータと言えばCPUとメモリ消費量が気軽でいいかな。Windowsではちょうどいいコマンドが用意されていないので探したらPythonのモジュールでちょうどいいのがあった。


psutil -


A cross-platform process and system utilities module for Python - Google Project Hosting

プロセスとシステムの使用量(CPU, disk, memory, network)を取得できる。
しかもLinux, Windows, OSX,FreeBSDに対応!32bitでも64bitでも!頼もしい!

(1) システムのCPU使用量(%)
import psutil
psutil.cpu_percent(interval=0.1, percpu=False)
  • intervalはCPU割り当て時間の計測期間
    • CPU割り当て時間 / 経過時間 * 100
    • interval=0.0 の場合は前回にこのメソッドが呼び出され時から計測
  • percpuは複数CPUある場合の挙動
    • Falseの場合は結果は1個にまとめられる。(上限は100%)
    • Trueの場合は結果はCPUの個数分、リストで出力される。
(2) システムの物理メモリ使用量(%)
import psutil
psutil.used_phymem()
(3) プロセスのCPU使用量・メモリ使用量
import psutil
# プロセスIDからProcessオブジェクトを生成
p = psutil.Process(pid)

# CPU使用量(%)
# interval引数の使い方は(1)と同様
# CPUが複数個の場合はCPU個数*100が上限となる
p.get_cpu_percent(interval=0.0)
# メモリ使用量(%) 
p.get_memory_percent()

2.3次元グラフを動かす

(1) 3次元のグラフ描画
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt

# Axes3DSubplotを取得
fig = plt.figure()
ax = fig.gca(projection='3d')

# 直線をプロット
x = [i for i in range(10)]
y = [i for i in range(10)]
z = [i for i in range(10)]
line, = ax.plot(x, y, zs=np.array(z), zdir='z')
plt.show()
(2) グラフを動かす

matplotlib.animationのFuncAnimation関数を使用する。

import matplotlib.animation as animation
line_ani = animation.FuncAnimation(fig, update_line, frames=360,
                                        fargs=(line, ax),
                                        interval=100, blit=False)
plt.show()
引数
fig Figureオブジェクト
func グラフを更新する関数。この関数の1個目の引数は現在のフレーム数が渡される。
frames 描画するフレーム数
fargs funcに渡す引数
interval グラフを更新する間隔
blit 描画するグラフを最適化するかどうか(?)
グラフを更新する関数の例
def update_line(num, line, ax):
    # ラインの更新
  # x軸、y軸、z軸それぞれに値リストをセットする。(伸びてく直線)
    line.set_xdata([i for i in range(num)])
    line.set_ydata([i for i in range(num)])
    line.set_3d_properties([i for i in range(num)])
    # グラフ全体を回転
    ax.view_init(30, 1 * num)

3.作ったスクリプト

psutil と matplotlib を使用してシステム・プロセスの3次元グラフ(x軸:メモリ使用量、y軸:時間、z軸:CPU使用量)をリアルタイムで描画するスクリプト。
This is a script which draws the amount of CPU used and memory usage of a process to a 3D graph. — Gist
(GitHubのGistを使ってみた。初回保存時、ログオンし忘れててAnonymousになってしまった……。)

<実行例>

f:id:meganehouser:20120206232535p:image
FuncAnimationの結果を動画で保存できるっぽいんだけどうまくいかない…。