Цель состоит в том, чтобы эффективно считывать данные с удаленного устройства (например, HDFS). С набором данных tenorflow я могу либо следовать указаниям здесь и использовать 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
, ссылку , чтобы читать из разных файлов на удаленном хосте, например
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
Я предполагаю, что они оба будут служить одной и той же цели, когда 4 потока моего процессора будут получать данные из 4 разных файлов, поэтому имеют лучшую пропускную способность, чем чтение 1 файла. Есть ли разница в этом случае, чтобы пойти на любой подход?
Я также предполагаю, что первый метод будет считывать из разных файлов в каждом пакете, больше похоже на поиск в удаленных файлах в ширину, а второй подход больше похож на поиск в моих удаленных файлах в глубину. Когда это локальная файловая система с низкой задержкой, может быть, это не имеет значения, но для удаленной, как HDFS, какой путь предпочтительнее?