0

我有一个来自 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.ndarraytype(data[0])返回numpy.void

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

4

2 回答 2

1

马特,你还在解决这个问题吗?我不是 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。也许您可以找到性能明显下降的点。

于 2019-02-07T03:39:00.540 回答
0

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

file = 'HDF5.h5';
hinfo = h5info(file);
% ... Find the dataset I want to extract
t = h5read(file, '/NASTRAN/RESULT/NODAL/EIGENVECTOR');
于 2019-06-05T19:37:30.913 回答