【问题标题】:Read large number of .h5 datasets读取大量 .h5 数据集
【发布时间】:2018-10-25 16:39:12
【问题描述】:

我正在处理这些 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 文件。如果你们中的一些人有一些加快代码速度的技巧,我将不胜感激

【问题讨论】:

  • 我不明白的事情:如果你这样做 t = [t;r]; 不会将向量 r 堆叠在另一个之上以获得一个大向量,而不是拥有一个大向量矩阵和其他人一起?

标签: matlab


【解决方案1】:

当我在编辑器中复制您的代码时,t 下的红色波浪号带有警告:

变量t 似乎在每次循环迭代时都会改变大小。考虑预分配速度。

您应该在开始循环之前分配 t 的最终内存,使用函数zeros:

t = zeros(80804,40401);

您还应该阅读以下内容:Programming Patterns: Maximizing Code Performance by Optimizing Memory Access:

  • 在循环中访问数组之前预分配数组
  • 按列存储和访问数据
  • 避免创建不必要的变量

也许p = '/mesh/'; 在循环内没用,可以在循环外完成,因为它不会改变。最好不要p,直接做s = strcat('/mesh/',j);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 2019-10-04
    相关资源
    最近更新 更多