PyTables 与 Matlab HDF5 读取时间
PyTables vs Matlab HDF5 read times
我有一个来自 NASTRAN 的 HDF5 输出文件,其中包含振型数据。我正在尝试将它们读入 Matlab 和 Python 以检查各种 post 处理技术。有问题的文件在这两个测试的本地目录中。该文件是 1.2 GB 的半大文件,但就我之前阅读的 HDF5 文件而言肯定没有那么大。我要访问的table中有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])
returns numpy.void
。
将我想要的数据集读入 Matlab 的正确(即快速)方法是什么?
马特,你还在解决这个问题吗?
我不是 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。也许您可以找到性能明显下降的点。
Matlab 提供了另一个名为 h5read
的 HDF5 reader。使用相同的基本方法,读取数据所需的时间大大减少。事实上,hdf5read
被列为在未来的版本中删除。这是具有首选功能的相同基本代码。
file = 'HDF5.h5';
hinfo = h5info(file);
% ... Find the dataset I want to extract
t = h5read(file, '/NASTRAN/RESULT/NODAL/EIGENVECTOR');
我有一个来自 NASTRAN 的 HDF5 输出文件,其中包含振型数据。我正在尝试将它们读入 Matlab 和 Python 以检查各种 post 处理技术。有问题的文件在这两个测试的本地目录中。该文件是 1.2 GB 的半大文件,但就我之前阅读的 HDF5 文件而言肯定没有那么大。我要访问的table中有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])
returns numpy.void
。
将我想要的数据集读入 Matlab 的正确(即快速)方法是什么?
马特,你还在解决这个问题吗?
我不是 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。也许您可以找到性能明显下降的点。
Matlab 提供了另一个名为 h5read
的 HDF5 reader。使用相同的基本方法,读取数据所需的时间大大减少。事实上,hdf5read
被列为在未来的版本中删除。这是具有首选功能的相同基本代码。
file = 'HDF5.h5';
hinfo = h5info(file);
% ... Find the dataset I want to extract
t = h5read(file, '/NASTRAN/RESULT/NODAL/EIGENVECTOR');