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

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

新規登録して質問してみよう
ただいま回答率
85.31%
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

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

Python

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

Q&A

解決済

1回答

11209閲覧

jupyter使用時のメモリについて

yu__

総合スコア108

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

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

Python

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

0グッド

1クリップ

投稿2019/04/24 05:28

jupyter使用時のメモリについて

最近、メモリを多く使う変数などをpythonで扱っているのでメモリが足りない
ことが多くて困っています。
そこでタスクマネジャーを見ながらメモリの使用状況を確認しつつ作業をしていたところ、
https://qiita.com/AnchorBlues/items/883790e43417640140aa
上記のサイトでdelを用いてメモリが大きいものを消してメモリを解放させよう的なことを言っているのですが、
そもそも、delで消してもメモリの数値は変わりませんでしたし、上記のサイトでメモリとされているものはメモリではないと思います。
なぜなら100000という値と1という値が同1として表されているから。

そこで、変数を消してメモリを増やす方法と今どのくらいメモリを消費しているかわかるようなライブラリはあるのでしょうか?

知っている方がいれば教えていただけると恐縮です。

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

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

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

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

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

quickquip

2019/04/24 05:47 編集

> なぜなら100000という値と1という値が同1として表されているから。 これはどういう意味ですか? 追記: 同1 は 同一 という意味 もしくは typoですか?
yoorwm

2019/04/24 05:46

「メモリが大きいものを消してメモリを解放させよう的なことを言っている」というのも訳が分かりませんが、参考にしている記事があるのですから、その参考にしている記事に書いてある通りの表現をするようにしてください。 (どうも、自分勝手な解釈でおかしな結論を出して「分からない」と言っている感じがします。)
yu__

2019/04/24 05:56

メモリ食ってる変数を確認・削除したいってのをメモリの解放と解釈してしまっていました。すみません。。。
tiitoi

2019/04/24 05:59

> なぜなら100000という値と1という値が同一として表されているから もしかして、100000 という値と1という値を表すのに必要なメモリ量が異なると思っていたということですか?
yu__

2019/04/24 05:59

a = 10000 aa= 1 import sys print("{}{: >25}{}{: >10}{}".format('|','Variable Name','|','Memory','|')) print(" ------------------------------------ ") for var_name in dir(): if not var_name.startswith("_"): print("{}{: >25}{}{: >10}{}".format('|',var_name,'|',sys.getsizeof(eval(var_name)),'|')) | Variable Name| Memory| ------------------------------------ | a| 28| | aa| 28| って感じに同じ値が出てしまうのはおかしいアルゴリズムなのではないかな?ということです!
tiitoi

2019/04/24 06:09 編集

回答のほうに転記
guest

回答1

0

ベストアンサー

変数を消してメモリを増やす方法

リンク先の Qiita の記事のやり方 (del で消す) で実際に変数を削除できますよ。

以下、確認した方法です。

python

1import sys 2import numpy as np 3 4def print_memory_usage(): 5 for var_name in globals(): 6 if not var_name.startswith("_"): 7 print("{: >25}{: >10} bytes".format(var_name, sys.getsizeof(eval(var_name)))) 8 9# データだけなら、8 * 100 * 100 * 3 = 240000 bytes 10mat = np.zeros((100, 100, 3), dtype=float) 11print_memory_usage()
mat 240128 bytes autopep8 80 bytes exit 56 bytes json 80 bytes np 80 bytes Out 288 bytes In 128 bytes isort 80 bytes print_memory_usage 136 bytes sys 80 bytes get_ipython 64 bytes

python

1del mat 2print_memory_usage()
quit 56 bytes autopep8 80 bytes exit 56 bytes json 80 bytes np 80 bytes Out 288 bytes In 128 bytes isort 80 bytes print_memory_usage 136 bytes sys 80 bytes get_ipython 64 bytes

今どのくらいメモリを消費しているかわかるようなライブラリはあるのでしょうか?

ソフトウェア (Windows ならタスクマネージャー、Linux なら free コマンド) で確認したほうがいいと思いますが、Python のコードで確認したい場合は、メモリなどシステムに関する情報を確認できる psutil というライブラリがあります。

pip install psutil でインストールできます。
psutil documentation — psutil 5.6.2 documentation

python

1import psutil 2 3info = psutil.virtual_memory() 4print(info) 5# svmem(total=67497332736, available=54389481472, percent=19.4, used=10516938752, 6# free=17032527872, active=18114748416, inactive=24519929856, buffers=431259648, 7# cached=39516606464, shared=2041597952, slab=6908645376) 8 9print('available: {:.2f} GB'.format(info.available / 2**30)) # available: 50.65 GB

1つの Notebook でいろいろなコードを実行していると、使ってない変数でもカーネルをシャットダウンする前まではずっと残っているので、使い終わった Notebook はシャットダウンしましょう。
書いてる最中でも試行錯誤して未使用な変数がスタックしてきたら、手動で消すより、Notebook をリスタートしたほうがよいです。

追記

100000という値と1という値が同一として表されているのはおかしい

Python の int 型は格納する値の大きさによって適切に拡張されるようになっているので、1 と 100000 はたまたま同じメモリ量で表されていたのだと思います。
C++ の std::vector のように最初は一定量のメモリを確保しておいて、足りなくなったら拡張するようになっているみたいです。

import sys a = 10000 b = 10000000000000000 print(sys.getsizeof(a), sys.getsizeof(b)) # 28, 32

詳しい解説が以下にありました。
Understanding memory allocation for large integers in Python - Stack Overflow

投稿2019/04/24 05:56

編集2019/04/24 06:09
tiitoi

総合スコア21960

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

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

KSwordOfHaste

2019/04/24 06:35

sys.getsizeofも完璧ではないようです。 mat2 = mat.T としてから del mat とすると実際にはmat2から元のTの内部配列が参照されているはずですがその分のメモリーサイズは表示してくれません。そのためmatを消して安心しても「実は表示されない領域がある」なんてことになりますね。 https://teratail.com/questions/116555 この質問のcan110さん回答が分かり易かったです。
tiitoi

2019/04/24 06:58 編集

補足していただきありがとうございます。 ある配列の view である numpy 配列を getsizeof して、実際のデータのサイズでなく、ビューオブジェクトのサイズが返るというのは、意図通りという認識ですが、確かにその点は注意が必要そうです。 import sys import numpy as np a = np.zeros((100, 100), dtype=float) b = a.T print(b.base is a) # b は a の View かどうか ==> True print(sys.getsizeof(a), sys.getsizeof(b)) # 80112 112
KSwordOfHaste

2019/04/24 07:13

自分はNotebookでよく使われるであろうライブラリーはmatplotlibやnumpyぐらいしか知らないので、Pythonインタープリタから直接見えない内部バッファー的なものを用いているものがnumpy以外にあるかわからないのですが、そういうものがもしあったら少々面倒ですね。tiitoiさん回答にあるようにカーネルをリスタートするのが簡単・確実な気がしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問