Для тех, кто предпочитает использовать PyTables , я переделал мои примеры h5py, чтобы показать различные способы копирования данных между двумя файлами HDF5. В этих примерах используются те же примеры файлов HDF5, что и раньше. Каждый файл имеет только один набор данных. Если у вас несколько наборов данных, вы можете расширить этот процесс с помощью walk_nodes()
в Pytables.
Все методы используют glob () для поиска файлов HDF5, используемых в следующих операциях.
Метод 1: Создание внешних ссылок
Подобно h5py, он создает 3 группы в новом файле HDF5, каждая из которых имеет внешнюю ссылку на исходные данные. Данные НЕ копируются.
import tables as tb
with tb.File('table_links_2.h5',mode='w') as h5fw:
link_cnt = 0
for h5name in glob.glob('file*.h5'):
link_cnt += 1
h5fw.create_external_link('/', 'link'+str(link_cnt), h5name+':/')
Метод 2: Копировать данные «как есть»
Копирует данные из каждого набора данных в оригиналефайл в новый файл, используя исходное имя набора данных. Объект набора данных того же типа, что и исходный файл HDF5. В этом случае они являются массивами PyTable (потому что все столбцы имеют одинаковый тип). Наборы данных копируются с использованием имени в исходном HDF5, поэтому каждый из них должен иметь разные имена. Данные не объединяются в один набор данных.
with tb.File('table_copy_2.h5',mode='w') as h5fw:
for h5name in glob.glob('file*.h5'):
h5fr = tb.File(h5name,mode='r')
print (h5fr.root._v_children)
h5fr.root._f_copy_children(h5fw.root)
Метод 3a: Объединить все данные в 1 массив
Это копирует и объединяет данные из каждого набора данных висходный файл в одном наборе данных в новом файле. Опять же, данные сохраняются в виде массива PyTables. Нет ограничений на имена наборов данных. Сначала я читаю данные и добавляю их в массив Numpy. После обработки всех файлов массив Numpy копируется в массив PyTables. Этот процесс удерживает массив Numpy в памяти, поэтому может не работать для больших наборов данных. Вы можете избежать этого ограничения, используя Pytables EArray (Enlargeable Array). См. Метод 3b.
with tb.File('table_merge_2a.h5',mode='w') as h5fw:
row1 = 0
for h5name in glob.glob('file*.h5'):
h5fr = tb.File(h5name,mode='r')
dset1 = h5fr.root._f_list_nodes()[0]
arr_data = dset1[:]
if row1 == 0 :
all_data = arr_data.copy()
row1 += arr_data.shape[0]
else :
all_data = np.append(all_data,arr_data,axis=0)
row1 += arr_data.shape[0]
tb.Array(h5fw.root,'alldata', obj=all_data )
Метод 3b: Объединить все данные в 1 Enlargeable EArray
Это похоже на метод выше, но сохраняет данные постепенно в EArray PyTables. Метод EArray.append()
используется для добавления данных. Этот процесс уменьшает проблемы с памятью в методе 3а.
with tb.File('table_merge_2b.h5',mode='w') as h5fw:
row1 = 0
for h5name in glob.glob('file*.h5'):
h5fr = tb.File(h5name,mode='r')
dset1 = h5fr.root._f_list_nodes()[0]
arr_data = dset1[:]
if row1 == 0 :
earr = h5fw.create_earray(h5fw.root,'alldata',
shape=(0,arr_data.shape[1]), obj=arr_data )
else :
earr.append(arr_data)
row1 += arr_data.shape[0]
Метод 4: Объединить все данные в 1 таблицу
В этом примере показаны различия между h5py и PyTables . В h5py наборы данных могут ссылаться на np.arrays
или np.recarrays
- h5py работает с разными dtypes. В Pytables массивы (и CArrays и EArrays) ссылаются на nd.array
данные, а таблицы ссылаются на np.recarray
данные. В этом примере показано, как преобразовать данные nd.array
из исходных файлов в данные np.recarray
, подходящие для объектов таблицы. Также показано, как использовать Table.append()
аналогично EArray.append()
в методе 3b.
with tb.File('table_append_2.h5',mode='w') as h5fw:
row1 = 0
for h5name in glob.glob('file*.h5'):
h5fr = tb.File(h5name,mode='r')
dset1 = h5fr.root._f_list_nodes()[0]
arr_data = dset1[:]
ds_dt= ([ ('f1', float), ('f2', float), ('f3', float), ('f4', float), ('f5', float) ])
recarr_data = np.rec.array(arr_data,dtype=ds_dt)
if row1 == 0:
data_table = h5fw.create_table('/','alldata', obj=recarr_data)
else :
data_table.append(recarr_data)
h5fw.flush()
row1 += arr_data.shape[0]