1GB分の複数のjpg画像を使って繰り返し処理をするプログラムを作っています。
処理はnumpyで行うのですが、1GB分すべてをndarrayに変換すると20GB近く膨れるのでメモリに乗りません。
なので、PILを使って1GB分をImageデータとして読み込んでおき、そこから必要な分だけをnumpyデータに逐一変換する方法をとりました。
しかし、繰り返しその処理を行うとなぜかpythonがメモリを占領していきます。
使用したndarrayをdelしても変わりません。これはなぜなのでしょうか?
以下に行ったプログラムの簡単に記述しました。これを実行するとどんどん使用メモリが増えていきます。
ループを数えたところだいたい150順ぐらいで12GBを超えました。
画像はすべて10MBくらいで大きな差はありません。
hoge関数を消しても相変わらずメモリは増えるのでnumpyの変換が原因なのかと思います。
python
1# 1GB分の画像データをPILで読み込みリストに入れる 2pil_img_list = [Image.open(name) for name in img_name_list] 3 4# 繰り返し操作 5while True: 6 # ランダムに画像を選択してndarrayに変換する 7 random_index = np.random.randint(0, len(pil_img_list)) 8 numpy_data = np.array(pil_img_list[random_index]) 9 10 # 何かしらの操作 11 hoge(numpy_data) 12 13 # 一応試した変数削除 14 print("numpy_data" in globals()) # True 15 del numpy_data 16 gc.collect() 17 print("numpy_data" in globals()) # False
環境の容量の関係上あらかじめndarrayを用意することができません。
上記に似た方法で処理を行いたいと思っています、ぜひ解決策をご教示願います。
環境
・windows10, Pycharm:2019.2.3, python3.7, Pillow:6.1.0, numpy:1.16.4
・Colaboratory, Pillow:4.3.0, numpy:1.17.3
メモリに関しては知識不足で詳細にお答えすることができません。
windowsではタスクマネージャーのパフォーマンスでメモリの使用量が増えることを確認し、
Colaboratoryでは12GのRAMのすべてを使用したためクラッシュしました。
--- 解決 ---
PILオブジェクトを定期的に読み込むことで解決しました。
python
1# 繰り返し操作 2while True: 3 # 1GB分の画像データをPILで読み込みリストに入れる 4 pil_img_list = [Image.open(name) for name in img_name_list] 5 6 # あらかじめ確認したメモリリークしない100周を回す 7 for i in range(100): 8 # ランダムに画像を選択してndarrayに変換する 9 random_index = np.random.randint(0, len(pil_img_list)) 10 numpy_data = np.array(pil_img_list[random_index]) 11 12 # 何かしらの操作 13 hoge(numpy_data)
回答2件
あなたの回答
tips
プレビュー