Как создать несколько файлов TFRecord вместо того, чтобы создать большой, а затем разделить его? - PullRequest
1 голос
/ 13 февраля 2020

Я имею дело с довольно большим набором данных временного ряда, который подготовлен как SequenceExample s, затем записывается в TFRecord. В результате получается довольно большой файл (более 100 ГБ), но я бы хотел, чтобы он хранился кусками. Я пробовал:

file = '/path/to/tf_record_0.tfrecords'
file_index = 0

   for record in dataset:
      # fill the time series window, prepare the sequence_example, etc.

      if os.path.exists(file) and os.path.getsize(file) > 123456789:
         file = file.replace(str(file_index), str(file_index + 1))
         file_index += 1

            with tf.io.TFRecordWriter(file) as writer:
               writer.write(sequence_example.SerializeToString())

... но поскольку TFRecordWriter открывает файлы типа Python open(file, mode='w'), он перезаписывается каждый раз, когда входит в блок with (кроме действительно уродливое решение) и из того, что я прочитал, нет способа изменить это поведение. Изменение пути на file внутри блока with, очевидно, приводит к ошибке.

Поэтому мой вопрос заключается в том, есть ли способ создать следующий файл TFRecord, когда ток достигнет определенного размера во время цикла и работы с моим набором данных ? И есть ли преимущество в том, что в любом случае файлы TFRecord поменьше, когда я не имею дело с какими-либо узкими местами, кроме недостатка системной памяти? Если я прав, Tensorflow может читать его с диска без проблем (хотя могут быть и другие причины, по которым в любом случае предпочтительнее иметь несколько файлов).

Одна вещь, о которой я могу подумать, - это создать какой-то буфер в list для готовых к сохранению последовательностей и создание / сохранение в TFRecord, как только этот буфер достигнет некоторого порога.

1 Ответ

0 голосов
/ 31 марта 2020

Используя Tensorflow 2.1.0 , возможно, вы могли бы попробовать этот подход при решении подобных проблем.

file = '/content/tmp/records/tf_record_{}.tfrecords'
file_index_count = 0

file_limit = 10
for index in range(file_limit):
  tfrecord_writer = tf.io.TFRecordWriter(file.format(file_index_count))
  ####
  # Add your Preprocessing Codes here
  # ie. split/divide array into 10 parts
  # ie. test_in = array[int(10*index): int(10*(index+1))]
  ####
  serial_test_in = serialize_example(test_in) 
  tfrecord_writer.write(serial_test_in)
  ###
  # Add your conditional for file index
  # ie. if size < totalsize
  ###
  file_index_count += 1

Это создает 10 файлов TF Records , как показано на этом скриншоте.

10_files of tfrecords

...