Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x tf.decode_csv函数中的Tensorflow内存泄漏_Python 3.x_Memory_Tensorflow_Memory Leaks - Fatal编程技术网

Python 3.x tf.decode_csv函数中的Tensorflow内存泄漏

Python 3.x tf.decode_csv函数中的Tensorflow内存泄漏,python-3.x,memory,tensorflow,memory-leaks,Python 3.x,Memory,Tensorflow,Memory Leaks,因此,我运行的DNN基于此处的iris模型:和此处的textlineReader建议: 它存在内存泄漏问题,我已将泄漏范围缩小到以下几行代码: import numpy as np import tensorflow as tf def main(): filename_queue = tf.train.string_input_producer(file_path) defaults = [[0.],[0.],[0.],[0.],[0]] reader = tf.Te

因此,我运行的DNN基于此处的iris模型:和此处的textlineReader建议:

它存在内存泄漏问题,我已将泄漏范围缩小到以下几行代码:

import numpy as np
import tensorflow as tf

def main():
    filename_queue = tf.train.string_input_producer(file_path)
    defaults = [[0.],[0.],[0.],[0.],[0]]
    reader = tf.TextLineReader()
    key, value = reader.read(filename_queue)

    for i in range(50000):
      columns = tf.decode_csv(value, record_defaults=defaults)

if __name__ == "__main__":
    main()
其中,文件路径引用的.csv文件包含一行:

5.9,3.0,4.2,1.5,1

当我运行程序时,这是我在60秒内的系统使用情况:

有趣的是,当我终止程序或OOM管理器终止程序时,所有内存都会被释放

无论如何,由于训练数据集的大小,我必须在我的程序中使用批处理,因此我也必须批量执行.csv文件的解码

有没有办法避免这个漏洞,或者这是一个应该报告的错误


欢迎提供任何信息或建议。

很明显,泄漏源于调用decode_csv函数,该函数分配了一些空间,在程序返回之前不会释放这些空间。解决方案是在获取批时在for循环之外调用tf.decode_csv函数。虽然这听起来不直观,但我已经能够验证它是否仍然通过连续读取来洗牌数据

更重要的是,这让我深入了解了Tensorflow中所谓的图操作的本质。在会话附近没有一个分配,它仍然有效。我想这更像是建立一条管道,然后通过管道传送数据


我的代码在没有那些malloc的情况下也运行得更快

很明显,泄漏源于调用decode_csv函数,该函数分配一些空间,在程序返回之前不会释放这些空间。解决方案是在获取批时在for循环之外调用tf.decode_csv函数。虽然这听起来不直观,但我已经能够验证它是否仍然通过连续读取来洗牌数据

更重要的是,这让我深入了解了Tensorflow中所谓的图操作的本质。在会话附近没有一个分配,它仍然有效。我想这更像是建立一条管道,然后通过管道传送数据

我的代码在没有那些malloc的情况下也运行得更快