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

问题描述 投票:0回答:1

我正在尝试使用postgreSQL查询导出整个数据库架构(大约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)
python pandas postgresql dask
1个回答
1
投票

我建议直接使用HDFStore,这样,您可以在从数据库中获取块时追加块,例如:

HDFStore

这是基于您现有的代码,因此尚不完整,如果不清楚,请告诉我

注意,我将以with pd.HDFStore('output.hdfs', '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

© www.soinside.com 2019 - 2024. All rights reserved.