我有51个大型HDF5表,每个表都有足够的(行为良好)数据,我甚至不能将其中的一个完全加载到内存中。为了使我的团队其他成员的生活更轻松,我需要将这些数据传输到PostgreSQL数据库中(并删除HDF5表)。然而,说起来容易做起来难,主要是因为这些障碍:
pandas.read_hdf()仍然有一个摇摇欲坠的chunksize kwag:所以问题;公开github发行pandas.DataFrame.to_sql()非常慢,效率很低:公开github发行 (请参阅我在问题页面底部的文章)基本上,要从HDF5 -> Pandas -> PostgreSQL出发,就需要通过广泛的猴子修补来跨越第1和第2栏。从HDF5 -> PostgreSQL直接走似乎没有直接的路可走。除非我错过了什么。
也许你们中的一个优秀的用户可以暗示一些我缺少的东西,一些你创造的解决类似问题的零碎作品,或者任何的建议或建议.
发布于 2016-08-17 00:00:00
您可以使用以下内容转换为CSV:
import csv
import h5py
with h5py.File('input.hdf5') as hdf5file:
with open('output.csv', 'w') as csvfile:
writer = csv.writer(csvfile)
for row in hdf5file['__data__']['table']:
writer.writerow(row)然后使用psql导入postgres
create table mytable (col1 bigint, col2 float, col3 float);
\copy mytable from 'output.csv' CSV根据数据的复杂性,您可能会做一些聪明的事情,将模式从hdf5文件中提取出来,并使用它来生成CREATE TABLE语句。
或者,您可以尝试在Python中编写自己的INSERT语句,这可能比使用COPY慢,但可能是一个更简单的解决方案:
import psycopg2
from itertools import islice
with h5py.File('input.hdf5') as hdf5file:
with psycopg2.connect("dbname=mydb user=postgres") as conn
cur = conn.cursor()
chunksize=50
t = iter(hdf5file['__data__']['table'])
rows = islice(t, chunksize)
while rows != []:
statement = "INSERT INTO mytable VALUES {}".format(','.join(rows))
cur.execute(row)
rows = islice(t, chunksize)
conn.commit()https://stackoverflow.com/questions/38986034
复制相似问题