2016年 12月 12日
>>> import os
>>> os.getpid()
15896
次に、psutilをインポートし、pidからカレントプロセスのオブジェクトを作る。
>>> import psutil
>>> current_process = psutil.Process(os.getpid())
これで、プロセスの様々な情報を得る準備ができた。
今回はメモリに注目するので、プロセスのmemory_info()を使う。
それでもたくさんの情報が出てきてウザイので、rssだけを表示しよう。
>>> current_process.memory_info()
pmem(rss=12869632, vms=70696960, shared=5763072, text=4096, lib=0, data=6778880, dirty=0)
>>> current_process.memory_info().rss
12869632
ここまでが準備だ。
>>> sz0=current_process.memory_info().rss
>>> a = [0]*10000000
>>> sz1=current_process.memory_info().rss
>>> sz1-sz0
80326656
要素数10Mのリストを作って、使用メモリが80MB増加しているので、1要素あたり8バイト増加していることになる。リストの中身は全部0なので、同じ0オブジェクトが使われている訳で、整数のオブジェクトは1つ作られただけで、消費メモリに影響しない。
>>> b = [i for i in range(10000000)]
>>> sz2=current_process.memory_info().rss
>>> sz2-sz1
405139456
10M個に対して約400MB増加しているので、1要素あたり40バイト増加したことになる。
リストの要素自体のサイズは8バイトなので、整数オブジェクトのサイズは32バイトのようだ。
>>> c = [i for i in range(10000000)]
>>> sz3=current_process.memory_info().rss
>>> sz3-sz2
405295104
bと同じ内容のリストcを作って、ほぼ同じ400MB増加した。
あれ、bとcで使われている整数はまったく同じだから、cを作るとき、新たな整数オブジェクトを用意する必要はないので、リストaと同じ80MB程度しか増えないはずでは?
はて、何が起きているんだろう。