Читать большое количество .h5 наборов данных - PullRequest
0 голосов
/ 24 октября 2018

Я работаю с этими файлами h5, которые имеют десятки тысяч наборов данных, содержащих векторы числовых значений и все одинакового размера.Моя цель - прочитать наборы данных и создать одну большую матрицу из этих векторов.Наборы данных имеют имена от «0» до «xxxxx» (некоторое большое число). Я смог прочитать их и получить матрицу, но для этого требуется вечность.Мне было интересно, можете ли вы взглянуть на мой код и предложить способ ускорить его работу, вот как я делаю это прямо сейчас

t =[];
for i = 0:40400 % there are 40401 datasets in this particular file
   j =  int2str(i); 
   p = '/mesh/';  % The parent group
   s = strcat(p,j);  % to create the full path of a dataset e.g. '/mesh/0'
   r = h5read('temp.h5',s);  % the file name is temp and s has the dataset path  
   t = [t;r];
end  

, в данном конкретном случае есть 40401 наборов данных, каждый из которых имеет80802x1 вектор числовых значений.Поэтому в конце концов я хочу создать 80802x40401 матрицу.Этот код занимает более одного дня, чтобы закончить.Я думаю, что одна из причин, почему это медленно, потому что в каждой итерации, Matlab обращаются к файлу h5.Буду признателен, если у некоторых из вас есть советы по ускорению кода

1 Ответ

0 голосов
/ 25 октября 2018

Когда я скопировал ваш код в редактор, я получил красную тильду под t с предупреждением:

По-видимому, переменная t меняет размер при каждой итерации цикла.Рассмотрим предварительное распределение для скорости.

speed

Вы должны выделить окончательную память t перед началом цикла с помощью функции zeros:

t = zeros(80804,40401);

Вы также должны прочитать это: Шаблоны программирования: максимизация производительности кода за счет оптимизации доступа к памяти :

  • Предварительно выделить массивы перед доступом к ним внутри циклов
  • Хранение и доступ к данным в столбцах
  • Избегайте создания ненужных переменных

Возможно p = '/mesh/'; бесполезно внутри цикла иможет быть сделано вне цикла, так как он не меняется.Может быть даже лучше не иметь p и напрямую делать s = strcat('/mesh/',j);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...