首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当从HDFS、TFRecordDataset+num_parallel_read等远程主机读取数据时,哪个更好?或parallel_interleave

当从HDFS、TFRecordDataset+num_parallel_read等远程主机读取数据时,哪个更好?或parallel_interleave
EN

Stack Overflow用户
提问于 2019-01-27 01:49:28
回答 1查看 1.1K关注 0票数 3

目标是高效地从远程(例如HDFS)读取数据。使用tensorflow数据集,我可以遵循here指南并使用parallel_interleave从远程主机中的不同文件中读取数据,如下所示

代码语言:javascript
复制
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_readslink从远程主机上的不同文件中读取数据,如下所示

代码语言:javascript
复制
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,哪种方法应该是首选的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-27 08:43:38

我刚刚浏览了TFRecordDatasetparallel_interleave的源代码。请注意,我正在查看tf.data.experimental,因为tf.contrib.data one已被弃用。有趣的是,它们都调用同一个类ParallelInterleaveDataset来利用并行读取。我猜这就变成了如何更好地优化流水线的选择,因为当使用parallel_interleave来潜在地加速流水线时,你可以使用像block_length,sloppy,buffer_output_elements和prefetch_input_elements这样的参数,同时在排序中也赋予了一些随机性。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54381036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档