我有一个来自NASTRAN的HDF5输出文件,其中包含模式形状数据。我试图将它们读入Matlab和Python,以检查各种后处理技术。所讨论的文件位于这两个测试的本地目录中。该文件是半大的,1.2GB,但肯定没有那么大的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中读取我想要的数据集的正确(即快速)方法是什么?
发布于 2019-06-05 19:37:30
Matlab提供了另一个名为HDF5的h5read阅读器。使用同样的基本方法,读取数据所需的时间大大减少。事实上,在将来的版本中,hdf5read是要删除的。下面是与perfered函数相同的基本代码。
file = 'HDF5.h5';
hinfo = h5info(file);
% ... Find the dataset I want to extract
t = h5read(file, '/NASTRAN/RESULT/NODAL/EIGENVECTOR');发布于 2019-02-07 03:39:00
马特你还在研究这个问题吗?我不是一个matlab的家伙,但我熟悉Nastran HDF5文件。您是对的;1.2 GB是很大的,但以今天的标准来说没有那么大。
您可以通过在特征向量数据集中运行不同行数的测试来诊断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中。也许你可以找到性能明显下降的点。
https://stackoverflow.com/questions/54300107
复制相似问题