【问题标题】:PyTables vs Matlab HDF5 read timesPyTables vs Matlab HDF5 读取时间
【发布时间】:2019-06-15 10:35:54
【问题描述】:

我有一个来自 NASTRAN 的 HDF5 输出文件,其中包含振型数据。我正在尝试将它们读入 Matlab 和 Python 以检查各种后处理技术。有问题的文件位于这两个测试的本地目录中。该文件是 1.2 GB 的半大文件,但就我之前读过的 HDF5 文件而言肯定没有那么大。我要访问的表中有 17567342 行和 8 列。第一列和最后一列是整数,中间 6 列是浮点数。

Matlab:

file = 'HDF5.h5';
hinfo = hdf5info(file);
% ... Find the dataset I want to extract
t = hdf5read(file, '/NASTRAN/RESULT/NODAL/EIGENVECTOR');

最后一个操作非常慢(可以以小时为单位)。

Python:

import tables
hfile = tables.open_file("HDF5.h5")
modetable = hfile.root.NASTRAN.RESULT.NODAL.EIGENVECTOR
data = modetable.read()

最后一个操作基本上是即时的。然后我可以访问data,就好像它是一个numpy数组一样。我显然错过了关于这些命令正在做什么的一些非常基本的东西。我认为这可能与数据转换有关,但我不确定。如果我这样做type(data),我会返回numpy.ndarray,而type(data[0]) 会返回numpy.void

将我想要的数据集读入 Matlab 的正确(即快速)方法是什么?

【问题讨论】:

  • type 更重要的是datadtypeshape

标签: python matlab hdf5 nastran


【解决方案1】:

Matlab 提供了另一个名为 h5read 的 HDF5 阅读器。使用相同的基本方法,读取数据所需的时间大大减少。事实上,hdf5read 会在未来的版本中被删除。这是与首选功能相同的基本代码。

file = 'HDF5.h5';
hinfo = h5info(file);
% ... Find the dataset I want to extract
t = h5read(file, '/NASTRAN/RESULT/NODAL/EIGENVECTOR');

【讨论】:

    【解决方案2】:

    马特,你还在解决这个问题吗? 我不是 matlab 人,但我熟悉 Nastran HDF5 文件。你说的对; 1.2 GB 很大,但按照今天的标准来说并没有那么大。
    您可以通过在 EIGENVECTOR 数据集中运行具有不同行数的测试来诊断 matlab 性能瓶颈。为此(无需运行大量 Nastran 作业),我创建了一些简单的代码来创建一个 HDF5 文件,其中包含用户定义的行数。它模仿了 Nastran 特征向量结果数据集的结构。见下文:

    import tables as tb
    import numpy as np
    hfile = tb.open_file('SO_54300107.h5','w')
    
    eigen_dtype = np.dtype([('ID',int), ('X',float),('Y',float),('Z',float),
                            ('RX',float),('RY',float),('RZ',float), ('DOMAIN_ID',int)])
    
    fsize = 1000.0
    isize = int(fsize)
    recarr = np.recarray((isize,),dtype=eigen_dtype)
    
    id_arr = np.arange(1,isize+1)
    dom_arr = np.ones((isize,), dtype=int)
    arr = np.array(np.arange(fsize))/fsize
    
    recarr['ID'] = id_arr
    recarr['X'] = arr
    recarr['Y'] = arr
    recarr['Z'] = arr
    recarr['RX'] = arr
    recarr['RY'] = arr
    recarr['RZ'] = arr
    recarr['DOMAIN_ID'] = dom_arr
    
    modetable = hfile.create_table('/NASTRAN/RESULT/NODAL', 'EIGENVECTOR',
                                     createparents=True, obj=recarr )
    
    hfile.close()
    

    尝试使用不同的 fsize 值(行数)运行它,然后将它创建的 HDF5 文件附加到 matlab。也许您可以找到性能明显下降的点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-27
      • 1970-01-01
      • 2015-10-21
      • 2011-06-05
      • 2015-10-10
      • 2017-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多