首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将整个(大)模式转换为hdf5

将整个(大)模式转换为hdf5
EN

Stack Overflow用户
提问于 2019-10-01 01:07:59
回答 1查看 368关注 0票数 0

我正在尝试使用postgreSQL query导出整个数据库模式(大约20 GB),以创建最终的唯一hdf5文件。

因为这个大小不适合我的计算机内存,所以我使用块参数。

首先,我使用这个函数来建立连接:

代码语言:javascript
复制
def make_connectstring(prefix, db, uname, passa, hostname, port):
    """return an sql connectstring"""
    connectstring = prefix + "://" + uname + ":" + passa + "@" + hostname + \
                    ":" + port + "/" + db
    return connectstring

然后我创建了一个临时文件夹来保存每个hdf5文件。

代码语言:javascript
复制
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)

将所有这些文件合并为代表整个数据帧的单个文件的最佳方式是什么?

我尝试了这样的东西:

代码语言:javascript
复制
    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)

然而,内存增长非常快。我需要更有效率的东西。

更新:

代码语言:javascript
复制
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)
EN

Stack Overflow用户

回答已采纳

发布于 2019-10-01 02:30:20

我建议直接使用HDFStore,这样您就可以在从数据库中获得块时添加它们,类似于:

代码语言:javascript
复制
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)为我描述了complevelcomplib

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58172357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档