PyTables против Matlab HDF5 время чтения - PullRequest
0 голосов
/ 22 января 2019

У меня есть выходной файл HDF5 от NASTRAN, который содержит данные формы режима. Я пытаюсь прочитать их в Matlab и Python, чтобы проверить различные методы пост-обработки. Этот файл находится в локальном каталоге для обоих этих тестов. Файл имеет небольшой размер - 1,2 ГБ, но, конечно, не такой большой с точки зрения файлов 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, как если бы он был массивом. Я явно упускаю что-то очень простое в том, что делают эти команды. Я думаю, что это может быть связано с преобразованием данных, но я не уверен. Если я сделаю type(data), я вернусь numpy.ndarray, а type(data[0]) вернет numpy.void.

Каков правильный (то есть быстрый) способ чтения набора данных, который я хочу, в Matlab?

Ответы [ 2 ]

0 голосов
/ 05 июня 2019

Matlab предоставил еще один HDF5-ридер под названием h5read. Используя тот же базовый подход, время, затраченное на чтение данных, было значительно сокращено. На самом деле hdf5read указан для удаления в будущей версии. Вот тот же базовый код с отработанными функциями.

file = 'HDF5.h5';
hinfo = h5info(file);
% ... Find the dataset I want to extract
t = h5read(file, '/NASTRAN/RESULT/NODAL/EIGENVECTOR');
0 голосов
/ 07 февраля 2019

Мэтт, вы все еще работаете над этой проблемой? Я не Matlab парень, но я знаком с файлом Nastran HDF5. Вы правы; 1,2 ГБ это большой, но не такой большой по сегодняшним меркам.
Возможно, вы сможете диагностировать горлышко производительности Matlab, выполнив тесты с различным числом строк в наборе данных EIGENVECTOR. Чтобы сделать это (без выполнения большого количества заданий Nastran), я создал простой код для создания файла HDF5 с определенным пользователем числом строк. Он имитирует структуру набора данных результатов Nastran Eigenvector. Смотри ниже:

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. Возможно, вы найдете момент, когда производительность заметно ухудшится.

...