

Pythonでデータオーグメンテーションするプログラムを書きました。  
5000枚ほどの入力画像を入れたいのですが、  
実行するに連れてメモリ使用量がどんどん増加します。  
メモリリークが疑えますので、ガーベジコレクション試みましたが解決できませんでした。  
解決に向けてのアドバイスを頂きたく質問します。  
よろしくおねがいします。

[code]

    import tensorflow as tf
    import numpy as np
    from PIL import Image
    import glob
    import os
    
    import configparser
    
    inifile = configparser.ConfigParser()
    inifile.read('./config.ini', 'UTF-8-SIG')
    in_image = glob.glob(inifile.get('directory', 'in_dir') + '/*')
    in_fileName = os.listdir(inifile.get('directory', 'in_dir'))
    
    #<<debug>>
    #print(in_image)
    #print(in_fileName)
    print(len(in_image))
    
    for num in range(len(in_image)):
        image = tf.read_file(str(in_image[num]))
        direct, filename = os.path.split(str(in_image[num]))
        name, ext = os.path.splitext(filename)
    
        print('direct:{}, file:{}'.format(direct, filename))
    
        if image is None:
            print("Not Open")
            continue
    
        with tf.Session() as sess:
            coord = tf.train.Coordinator()
            threads = tf.train.start_queue_runners(coord=coord)
            for i in range(5):
    
                if int(inifile.get('format', 'JPG')) == 1:
                    tmp_img = tf.cast(tf.image.decode_jpeg(image, channels=3), tf.float32)
                elif int(inifile.get('format', 'BMP')) == 1:
                    tmp_img = tf.cast(tf.image.decode_image(image, channels=3), tf.float32)
    
                if int(inifile.get('data_arg_flip', 'flag_flip')) == 1:
                    tmp_img = tf.image.random_flip_left_right(tmp_img)
    
                if int(inifile.get('data_arg_brightnes', 'flag_brightness')) == 1:
                    tmp_img = tf.image.random_brightness(tmp_img, max_delta = int(inifile.get('data_arg_brightnes', 'max_delta')))
    
                if int(inifile.get('data_arg_contrast', 'flag_contrast')) == 1:
                    tmp_img = tf.image.random_contrast(tmp_img, lower=float(inifile.get('data_arg_contrast', 'lower')), upper=float(inifile.get('data_arg_contrast', 'upper')))        
    
                if int(inifile.get('data_arg_rot', 'flag_rot')) == 1:
                    tmp_img = tf.image.rot90(tmp_img, k=i)
    
                out_img = sess.run(tmp_img)
    #            print(img.shape)
    #            print(img)
    
                if int(inifile.get('format', 'JPG')) == 1:
                    Image.fromarray(np.uint8(out_img)).save(inifile.get('directory', 'out_dir') + '/' + name + '_{0:03d}.jpg'.format(i))
                elif int(inifile.get('format', 'BMP')) == 1:
                    Image.fromarray(np.uint8(out_img)).save(inifile.get('directory', 'out_dir') + '/' + name + '_{0:03d}.bmp'.format(i))
    
[/code]

iniファイル

[code]

    # file directory
    [directory]
    in_dir = ./original_image
    out_dir = ./out_image
    
    # data format
    [format]
    JPG = 0
    BMP = 1
    
    # arg_settings
    [data_arg_set]
    arg_num = 4
    
    # function settings
    [data_arg_flip]
    flag_flip = 0
    
    [data_arg_brightnes]
    flag_brightness = 1
    max_delta = 1
    # max : 63
    
    [data_arg_contrast]
    flag_contrast = 1
    lower = 0.8
    upper = 1.0
    # min : 0.1
    # max : 2.0
    
    [data_arg_rot]
    flag_rot = 0
    
[/code]


CC BY-SA 4.0
2018-11-28T12:30:51.553
50722
2018-11-28T13:24:33.137
29163
question
python
Pythonのメモリリーク


私は`tf.train.Coordinator()`のようなコードに関するライブラリを使ったことはないのですが、  
コード規約から察するに、何かのクラスですよね？  
このコードが`for num in
range(len(in_image)):`でシーケンス処理の対象となり、何度も呼び出されています。`python`では、ループ内で新たにインスタンスを生成しても、上書きされることはなく、シーケンスが終了するまで新しいインスタンスがいくつもメモリに出来上がります。  
私はこれと同じ体験を、`pygame`の`while`ループ内で経験したことがありますから、これが原因だと思います。ですから、一回作ればいいインスタンスならば、ループ外で実行処理を行った方がよいでしょう。  
特にこの場合は、そうした方がよろしいかと思います。


CC BY-SA 4.0
2018-11-28T12:37:42.317
50724
2018-11-28T12:37:42.317
24284
50722
answer