Я тестирую способы эффективного сохранения и извлечения данных с использованием h5py. Но у меня проблемы со временем выполнения, когда я не использую всю мою память.
В моем первом методе я просто создаю файл * stati c h5py
with h5py.File(fileName, 'w') as f:
f.create_dataset('data_X', data = X, dtype = 'float32')
f.create_dataset('data_y', data = y, dtype = 'float32')
Во втором методе я установите параметр maxshape , чтобы добавить больше обучающих данных в будущем. (см. Как добавить данные к одному указанному c набору данных в файле hdf5 с h5py )
with h5py.File(fileName2, 'w') as f:
f.create_dataset('data_X', data = X, dtype = 'float32',maxshape=(None,4919))
f.create_dataset('data_y', data = y, dtype = 'float32',maxshape=(None,6))
Я использую PyTorch и настроил свой загрузчик данных следующим образом:
class H5Dataset_all(torch.utils.data.Dataset):
def __init__(self, h5_path):
# super(dataset_h5, self).__init__()
self.h5_path = h5_path
self._h5_gen = None
def __getitem__(self, index):
if self._h5_gen is None:
self._h5_gen = self._get_generator()
next(self._h5_gen)
return self._h5_gen.send(index)
def _get_generator(self):
with h5py.File( self.h5_path, 'r') as record:
index = yield
while True:
X = record['data_X'][index]
y = record['data_y'][index]
index = yield X, y
def __len__(self):
with h5py.File(self.h5_path,'r') as record:
length = record['data_X'].shape[0]
return length
loader = Data.DataLoader(
dataset=H5Dataset_all(filename),
batch_size=BATCH_SIZE,
shuffle=True, num_workers=0)
Сохранив одинаковые данные для каждого из этих методов, я ожидал бы, что они будут одинаковыми во время выполнения, однако это не так. Данные, которые я использовал, имеют размер X.shape=(200722,4919)
и y.shape=(200772,6)
. Файлы имеют размер 3,6 ГБ каждый. Я проверяю время пробега, используя:
import time
t0 = time.time()
for i, (X_batch, y_batch) in enumerate(loader):
# assign a dummy value
a = 0
t1 = time.time()-t0
print(f'time: {t1}')
Для первого метода время пробега составляет 83 с , а для второго оно составляет 1216 с , что в моем ум не имеет смысла. Может кто-нибудь помочь мне понять, почему?
Кроме того, я также попытался сохранить / загрузить его в виде файла факела, используя torch.save
и torch.load
и передав данные в Data.TensorDataset
перед настройкой загрузчика. Эта реализация работает значительно быстрее (около 3,7 с ), но имеет недостаток, заключающийся в необходимости загружать файлы перед тренировкой, что может быть быстро ограничено моей памятью.
Есть ли лучший способ в котором я могу тренироваться несколько быстрее, не загружая все данные перед тренировкой?