2016-02-01 2 views
2

Как показано в примерах official MATLAB documentation, можно записать в бесконечный hdf5 файл, используя следующий код:Эффективность неограниченных hdf5 файлов в MATLAB

h5create('myfile.h5','/DS3',[20 Inf],'ChunkSize',[5 5]); 

for j = 1:10 
     data = j*ones(20,1); 
     start = [1 j]; 
     count = [20 1]; 
     h5write('myfile.h5','/DS3',data,start,count); 
end 
h5disp('myfile.h5'); 

Я не знаком с тем, как MATLAB имеет дело с hdf5 файлами, но эффективнее ли распределять размер файла?

Мне нужно написать очень большой набор данных, и найти его размер - нетривиальная задача.

+0

Вы пробовали проверить его? напишите дамп в файле hdf5, не сообщив размер и не сообщив об этом, и пришло время! –

+0

Я работаю над этим, но иногда по размеру данных вы можете получить различные тайминги. Я понимаю, что происходит в нем. Я собираюсь позволить ему работать до завтра и посмотреть, что происходит. –

+0

Включите команду 'save' в ваше сравнение. Используя формат '-v7.3', он записывает сжатый файл с поддержкой gzip HDF5. Это может быть самый быстрый вариант. – Daniel

ответ

0

Короткий ответ: Написание конечных файлов происходит быстрее, чем запись одного и того же количества данных в бесконечном файле. Однако при использовании бесконечных файлов динамического перераспределения всего файла не происходит, и запись данных остается довольно быстрой.

Длинный ответ: Путь данные сохраняются объясняется в 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.

Смежные вопросы