我正在尝试使用postgreSQL查询导出整个数据库模式(大约20gb),以创建最终唯一的hdf5文件。你知道吗
因为这个大小不适合我的计算机内存,所以我使用chuncks参数。你知道吗
首先,我使用此函数建立连接:
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)
我建议您直接使用^{} ,这样您就可以在从数据库中获取块时附加它们,例如:
这是基于你现有的代码,所以是不完整的,让我知道如果它不清楚
注意,我正在以
w
模式打开存储,因此每次都会删除文件。否则append
将继续向表的末尾添加相同的行。或者你可以先remove
键当你打开商店的时候,你也会得到很多像压缩这样的选项,但是它似乎没有很好的文档记录,
help(pd.HDFStore)
为我描述了complevel
和complib
相关问题 更多 >
编程相关推荐