【发布时间】:2019-01-26 17:49:28
【问题描述】:
目标是高效地从远程(例如 HDFS)读取数据。使用 tensorflow 数据集,我可以按照指南 here 并使用 parallel_interleave 从远程主机中的不同文件中读取,就像这样
def input_fn():
files = tf.data.Dataset.list_files("hdfs:///path/to/dataset/train-*.tfrecord")
dataset = filenames.apply(
tf.data.experimental.parallel_interleave(
lambda filename: tf.data.TFRecordDataset(filename),
cycle_length=4))
dataset = dataset.map(map_func=parse_fn)
dataset = dataset.batch(batch_size=FLAGS.batch_size)
dataset = dataset.prefetch(buffer_size=FLAGS.prefetch_buffer_size)
return dataset
或者我可以使用num_parallel_reads、link 来读取远程主机中的不同文件,就像这样
def input_fn():
files = tf.data.Dataset.list_files("hdfs:///path/to/dataset/train-*.tfrecord")
dataset = tf.data.TFRecordDataset(files, num_parallel_reads=4)
dataset = dataset.map(map_func=parse_fn)
dataset = dataset.batch(batch_size=FLAGS.batch_size)
dataset = dataset.prefetch(buffer_size=FLAGS.prefetch_buffer_size)
return dataset
我假设它们都有相同的用途,我的 cpu 的 4 个线程将从 4 个不同的文件中获取数据,因此比读取 1 个文件具有更好的吞吐量。在这种情况下,两种方法都有区别吗?
我还假设第一种方法会从每批的不同文件中读取,更像是对我的远程文件的广度优先搜索,而第二种方法更像是对我的远程文件的深度优先搜索。当它是具有低延迟的本地文件系统时,也许没关系,但是对于像 HDFS 这样的远程文件系统,这应该是首选的方式吗?
【问题讨论】:
标签: python tensorflow hdfs tensorflow-datasets tfrecord