PyTables与Matlab HDF5的读取时间

时间:2019-01-22 01:43:41

标签: python matlab hdf5 nastran

我有一个来自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的正确(即快速)方法是什么?

2 个答案:

答案 0 :(得分: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。也许您可以找到性能明显下降的地方。

答案 1 :(得分:0)

Matlab提供了另一个名为h5read的HDF5阅读器。使用相同的基本方法,可以大大减少读取数据所需的时间。实际上,hdf5read已列出要在将来的版本中删除。这是具有相同功能的基本代码。

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