Python tensorflow-TFRecordWriter在写入文件时会占用太多内存?

Python tensorflow-TFRecordWriter在写入文件时会占用太多内存?,python,for-loop,memory,tensorflow,iterator,Python,For Loop,Memory,Tensorflow,Iterator,我正在处理一个大型数据集,其中有306400个图像需要处理 但我要做的事情非常简单:调整图像大小,然后写入.TFRecords文件 然而,我得到了一个内存不足的错误 由于无法追加.TFRecord文件,我无法多次运行脚本,因此我必须在一次运行中写入所有数据 我曾尝试使用几个for循环,因为我认为在每次for循环之后,使用的内存都会被释放,但似乎我错了 因此,我随后尝试使用iter()获取迭代器,因为对于dict对象,使用dict.iter()可以节省内存,而不是dict.iter() 但是没有魔

我正在处理一个大型数据集,其中有306400个图像需要处理

但我要做的事情非常简单:调整图像大小,然后写入
.TFRecords
文件

然而,我得到了一个
内存不足的错误

由于无法追加
.TFRecord
文件,我无法多次运行脚本,因此我必须在一次运行中写入所有数据

我曾尝试使用几个
for
循环,因为我认为在每次
for
循环之后,使用的内存都会被释放,但似乎我错了

因此,我随后尝试使用
iter()
获取迭代器,因为对于
dict
对象,使用
dict.iter()
可以节省内存,而不是
dict.iter()

但是没有魔法

所以现在我不知道如何解决这个问题

def gen_records(record_name, img_path_file, label_map):
    writer = tf.python_io.TFRecordWriter(record_name)
    classes = []

    with open(label_map, 'r') as f:
        for l in f.readlines():
            classes.append(l.split(',')[0])

    with open(img_path_file, 'r') as f:
        lines = f.readlines()
        num_images = len(lines)
    print 'total number to be written' + str(num_images)
    print 'start writing...'

    patches = []
    with open(img_path_file, 'r') as f:
        for patch in f.readlines():
            patches.append(patch[:-1])

    cnt = 0
    for patch in patches:
        cnt += 1
        # print '[' + str(cnt) + ' / ' + str(num_images) + ']' + 'writing  ' + str()
        img = tf.image.resize_images(np.array(Image.open(patch)), (224, 224), method=tf.image.ResizeMethod.BILINEAR)
        img_raw = np.array(img).tostring()
        label = classes.index(patch.split('/')[1])
        example = tf.train.Example(features=tf.train.Features(feature={
            'label': _int64_feature(int(label)),
            'image': _bytes_feature(img_raw)
        }))

        writer.write(example.SerializeToString())

    writer.close()

如何“释放”每次迭代后使用的内存?或者如何保存内存?

首先要尝试的是按需加载每个图片。删除加载PIC的行(第15至18行),并在gen_记录之外定义以下功能:

def generate_patches():
    with open('testfile.txt', 'r') as f:
        for patch in f.readlines():
            yield patch[:-1]
然后将for循环的定义替换为

for patch in generate_patches():
    ...

对第55行的
iter
的调用是不必要的,并且根本不能保护内存,因为原始列表仍然存在。您可以定义一个生成补丁的生成器。问题可能是您试图将所有306400张图片加载到内存中,以便通过一次调用
write
保存它们。这意味着,即使每个图片的大小只有100KB,您也需要超过30GB的工作内存。该错误表明您的内存对于数据集来说太小。我编辑了代码并尝试在每个循环中执行
write
,但使用的内存仍在不断增加。问题是,我认为如果我对
循环使用
,那么每个图像都会被打开和处理,在下一个循环中,使用的内存会被自动清除,但不会。有什么方法可以单独加载图片吗?@MaxPowers另外,在编辑的代码中,变量应该在每个循环中重新分配,那么巨大的已用内存属于哪里呢?占用内存的是
tensorflow
,而不是Python代码。您必须深入到模块中去,找出什么没有释放内存,我打赌
tf.python\u io.TFRecordWriter