У меня есть много больших 1-D HDF5 наборов данных со следующими свойствами:Переход от HDF5 к PostgreSQL
- инициализации размер = (5201,),
- maxshape = (6000000,),
- DTYPE = 'float32'
- кусками = (10000,)
- сжатия = "GZIP"
- пример Путь: файл [ "Группа"] [ "1"] [ "Группа1"] [ "2"] [» Dataset "]
Я хочу, чтобы переместить их в PostgreSQL, я съезжались со структурой базы данных и вставки данных, но каждый наполнении занимает ~ 650 секунд 72,4mb файла hdf5, может кто-то дать мне советы/рекомендации, как можно улучшить представление?
Что я сейчас:
def fill_database(self, dog):
if isinstance(dog, h5py.Dataset):
name = dog.name.split('/')
table_name = '{}_{}'.format(name[3], name[5])
data = dog.value.astype(int).tolist()
self.cur.execute('CREATE TABLE IF NOT EXISTS {} (cur_id INT PRIMARY KEY , data INT[]);'.format(table_name))
self.cur.execute('INSERT INTO {} VALUES (%s, %s)'.format(table_name), (name[2], data))
if isinstance(dog, h5py.Group):
for k, v in dict(dog).items():
self.fill_database(v)
Что я пробовал:
import psycopg2
import h5py
from itertools import islice
with h5py.File('full_db.hdf5') as hdf5file:
with psycopg2.connect(database='hdf5', user='postgres', password='pass', port=5432) as conn:
cur = conn.cursor()
cur.execute('drop table if EXISTS mytable;')
cur.execute('create table mytable (data INT[]);')
chunksize = 10000
t = iter(hdf5file["Group"]["1"]["Group1"]["2"]["Dataset"][:].astype(int))
rows = islice(t, chunksize)
while rows:
statement = "INSERT INTO mytable(data) VALUES {}".format(rows) # I stuck here
cur.execute(statement)
rows = islice(t, chunksize)
conn.commit()
Кроме того, я пытался сделать что-то с LIMIT в PostgreSQL и многими другими способами, но я не был успешным.
Я думаю, что некоторые из проблем могут быть из-за массивов в базе данных, я использую их для более позднего более удобного вывода.