我正在尝试使用postgreSQL query导出整个数据库模式(大约20 GB),以创建最终的唯一hdf5文件。
因为这个大小不适合我的计算机内存,所以我使用块参数。
首先,我使用这个函数来建立连接:
def make_connectstring(prefix, db, uname, passa, hostname, port):
"""return an sql connectstring"""
connectstring = prefix + "://" + uname + ":" + passa + "@" + hostname + \
":" + port + "/" + db
return connectstring然后我创建了一个临时文件夹来保存每个hdf5文件。
def query_to_hdf5(connectstring, query, verbose=False, chunksize=50000):
engine = sqlalchemy.create_engine(connectstring,
server_side_cursors=True)
# get the data to temp chunk filese
i = 0
paths_chunks = []
with tempfile.TemporaryDirectory() as td:
for df in pd.read_sql_query(sql=query, con=engine, chunksize=chunksize):
path = td + "/chunk" + str(i) + ".hdf5"
df.to_hdf(path, key='data')
print(path)
if verbose:
print("wrote", path)
paths_chunks.append(path)
i+=1
connectstring = make_connectstring(prefix, db, uname, passa, hostname, port)
query = "SELECT * FROM public.zz_ges"
df = query_to_hdf5(connectstring, query)将所有这些文件合并为代表整个数据帧的单个文件的最佳方式是什么?
我尝试了这样的东西:
df = pd.DataFrame()
print(path)
for path in paths_chunks:
df_scratch = pd.read_hdf(path)
df = pd.concat([df, df_scratch])
if verbose:
print("read", path)然而,内存增长非常快。我需要更有效率的东西。
更新:
def make_connectstring(prefix, db, uname, passa, hostname, port):
"""return an sql connectstring"""
connectstring = prefix + "://" + uname + ":" + passa + "@" + hostname + \
":" + port + "/" + db
return connectstring
def query_to_df(connectstring, query, verbose=False, chunksize=50000):
engine = sqlalchemy.create_engine(connectstring,
server_side_cursors=True)
# get the data to temp chunk filese
with pd.HDFStore('output.h5', 'w') as store:
for df in pd.read_sql_query(sql=query, con=engine, chunksize=chunksize):
store.append('data', df)发布于 2019-10-01 02:30:20
我建议直接使用HDFStore,这样您就可以在从数据库中获得块时添加它们,类似于:
with pd.HDFStore('output.h5', 'w') as store:
for df in pd.read_sql_query(sql=query, con=engine, chunksize=chunksize):
store.append('data', df)这是基于你现有的代码,所以不完整,如果不清楚,请让我知道
注意,我是在w模式下打开存储的,所以每次都会删除该文件。否则,append只会不断地将相同的行添加到表的末尾。或者,您也可以先remove密钥
当你打开商店时,你也会看到很多选择,比如压缩,但它似乎没有很好的文档,help(pd.HDFStore)为我描述了complevel和complib
https://stackoverflow.com/questions/58172357
复制相似问题