Multithreading 使用多线程写入TFR记录时发生异常
我有一个巨大的视频数据集;对于每个视频,我都有一个包含相应帧的文件夹。Multithreading 使用多线程写入TFR记录时发生异常,multithreading,exception,tensorflow,python-multithreading,tfrecord,Multithreading,Exception,Tensorflow,Python Multithreading,Tfrecord,我有一个巨大的视频数据集;对于每个视频,我都有一个包含相应帧的文件夹。 我正在为每个视频编写一个TFRecord,使用,其中FeatureList是视频的帧 我使用一个python线程池来迭代视频列表,其中每个线程处理一个视频。然后,我使用一个tensorflow队列对帧进行操作 我的脚本的结构如下所示: videos_id = os.listdir(dset_dir) def main_loop(video): frames_list = get_frames(video)
我正在为每个视频编写一个TFRecord,使用,其中FeatureList是视频的帧 我使用一个python线程池来迭代视频列表,其中每个线程处理一个视频。然后,我使用一个tensorflow队列对帧进行操作 我的脚本的结构如下所示:
videos_id = os.listdir(dset_dir)
def main_loop(video):
frames_list = get_frames(video)
filename_queue = tf.train.string_input_producer(frames_list)
reader = tf.WholeFileReader()
key, value = reader.read(filename_queue)
my_img = tf.image.decode_jpeg(value)
# resize, etc ...
init_op = tf.global_variables_initializer()
sess = tf.InteractiveSession()
with sess.as_default():
sess.run(init_op)
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(coord=coord)
# accumulating images of 1 video
image_list = []
for i in range(len(frames_list)):
image_list.append(my_img.eval(session=sess))
coord.request_stop()
coord.join(threads)
writer = tf.python_io.TFRecordWriter(tfrecord_name)
ex = make_example(image_list)
writer.write(ex.SerializeToString())
writer.close()
sess.close()
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
future = {executor.submit(
main_loop, video): video for video in videos_id}
在播放了上千个视频之后,我得到了以下异常(重复了很多次,针对不同的“线程id”):
知道为什么会这样吗?
提前感谢。我使用了这种显然更干净的方法来停止协调器。 我不确定这是否有帮助
# ....
# this will throw an OutOfRange exeption after 1 epoch, i.e. one video
filename_queue = tf.train.string_input_producer(frames_list, num_epochs=1)
# ....
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
# ...
# After everything is built, start the loop.
try:
while not coord.should_stop():
#read you frame
except tf.errors.OutOfRangeError:
# means the loop has finished
# write yuor tfrecord
finally:
# When done, ask the threads to stop.
coord.request_stop()
我用了一种显然更干净的方法来阻止协调人。 我不确定这是否有帮助
# ....
# this will throw an OutOfRange exeption after 1 epoch, i.e. one video
filename_queue = tf.train.string_input_producer(frames_list, num_epochs=1)
# ....
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
# ...
# After everything is built, start the loop.
try:
while not coord.should_stop():
#read you frame
except tf.errors.OutOfRangeError:
# means the loop has finished
# write yuor tfrecord
finally:
# When done, ask the threads to stop.
coord.request_stop()
嗯,你已经要求排队的人停下来。问题是他们在吵闹吗?谢谢@AllenLavoie。我认为请求_stop()是在for循环之后执行的,所以当这个视频没有更多的帧要处理时,不是吗?如果是这样的话,我想这很好。问题是它能正确处理±1000个视频,但在某个时候它会引发这个异常……它应该处理多少个视频?此错误是否在请求停止之前打印?可能是数据耗尽,并以一种模糊的方式显示;您可以从
tf.contrib.data
(tf.data
在tf1.4中)获得更好的错误消息。我将50k个元素排队。我现在在看内存使用情况,它一直在不断增加。当内存使用率达到98%时会引发异常,这可以解释“排队操作被取消”的原因。TFRecordWriter是否可能存在内存泄漏?好吧,您正在将它们添加到列表中;如果去掉它,内存使用率还会增加吗?中间队列有多大(如果有的话)?您已经请求队列运行者停止。问题是他们在吵闹吗?谢谢@AllenLavoie。我认为请求_stop()是在for循环之后执行的,所以当这个视频没有更多的帧要处理时,不是吗?如果是这样的话,我想这很好。问题是它能正确处理±1000个视频,但在某个时候它会引发这个异常……它应该处理多少个视频?此错误是否在请求停止之前打印?可能是数据耗尽,并以一种模糊的方式显示;您可以从tf.contrib.data
(tf.data
在tf1.4中)获得更好的错误消息。我将50k个元素排队。我现在在看内存使用情况,它一直在不断增加。当内存使用率达到98%时会引发异常,这可以解释“排队操作被取消”的原因。TFRecordWriter是否可能存在内存泄漏?好吧,您正在将它们添加到列表中;如果去掉它,内存使用率还会增加吗?中间队列有多大(如果有?)?