Короткий ответ: Написание конечных файлов происходит быстрее, чем запись одного и того же количества данных в бесконечном файле. Однако при использовании бесконечных файлов динамического перераспределения всего файла не происходит, и запись данных остается довольно быстрой.
Длинный ответ: Путь данные сохраняются объясняется в hdf5 documentation, вот короткая цитата из него.
Для хранения данных, хранящихся в памяти, данные хранятся в одном или нескольких фрагментах. Каждый блок является непрерывным блоком в файле, но куски не обязательно сохраняются смежно. Каждый кусок имеет одинаковый размер. Базис данных имеет тот же номинальный размер, что и смежный массив (число элементов x размер элемента), но хранилище выделяется кусками , поэтому общий размер файла может быть больше, чем номинальный размер . массив. См. Рисунок ниже.
без использования какой-либо оптимизации, как один цитируемого Даниил, я попытался написать фиктивный файл, содержащий 200 МБ данных, используя следующий код:
Без использования бесконечного размера:
h5create('train.h5','/data',[size_x size_y 3 length(label)]);
h5create('train.h5','/label',[1 length(label)]);
tic
h5write('train.h5','/data', data)
h5write('train.h5','/label', label)
fprintf('Writing finite file :')
toc
Использование бесконечного размера:
h5create('train.h5','/data',[size_x size_y 3 Inf],'ChunkSize',[size_x size_y 3 56]);
h5create('train.h5','/label',[1 Inf],'ChunkSize',[1 56]);
tic
for ii = 1:round(length(data)/56)
data_info = h5info('train.h5');
data_start = [1, 1, 1, data_info.Datasets(1).Dataspace.Size(end)+1];
data_count = [size_x, size_y, 3, 56];
label_start = [1, data_info.Datasets(1).Dataspace.Size(end)+1];
label_count = [1, 56];
h5write('train.h5', '/data', data(:, :, :, (ii-1)*56+1:ii*56), data_start, data_count);
h5write('train.h5', '/label', label((ii-1)*56+1:ii*56), label_start, label_count);
end
fprintf('Writing infinite file :')
toc
вывод в окне печати в окне команд:
Написание файла: Истекшее время составляет 1.924045 секунд.
Написание бесконечного файла: Истекшее время 11.809602 секунд.
Возможное объяснение разницы во времени происходит из вычислений, происходящих в Matlab, для определения параметров chunck.
Вы пробовали проверить его? напишите дамп в файле hdf5, не сообщив размер и не сообщив об этом, и пришло время! –
Я работаю над этим, но иногда по размеру данных вы можете получить различные тайминги. Я понимаю, что происходит в нем. Я собираюсь позволить ему работать до завтра и посмотреть, что происходит. –
Включите команду 'save' в ваше сравнение. Используя формат '-v7.3', он записывает сжатый файл с поддержкой gzip HDF5. Это может быть самый быстрый вариант. – Daniel