试图找到将 SQL 查询转换为具有大量记录的 Pandas DataFrame 的最有效方法

Trying to find the most efficient way to convert SQL Query to Pandas DataFrame that has large number of records

我正在尝试查询 MS-SQL 数据库视图并将结果转换为 Pandas DataFrame。

以下是我尝试过的两种不同方法,在这两种情况下,查询和转换为具有 415076 条记录 的 DataFrame 都需要 ~439.98 秒(~7 分钟) (这次是将其转换为DataFrame,而不是用于数据检索)。这是我应用业务逻辑中用户请求的数据input/retrieval部分的一个典型案例。

注意:对于记录较少的查询(比如在 x1000 中),两种情况下查询结果到 DataFrame 的转换性能都很快。

query = """ SELECT * 
            FROM db_view_name 
            WHERE CONDITION_1 = %d AND
            CONDITION_2 IN (%s) """ %(int(val), ','.join(map(str, my_values_list)))
con = pyodbc.connect(con_string)

Case 1:
    cursor = con.cursor()
    result = cursor.execute(query)
    items = [dict(zip([key[0] for key in cursor.description], row)) for row in result]
    df = pd.DataFrame(items)

Case 2:
    df = pd.read_sql_query(query, con)

我的环境: 我正在使用 Python 3.6 与金字塔网络框架和 SQLAlchemy ORM。

如何减少处理这么多记录所需的时间?对此问题的任何帮助将不胜感激:)

仅供参考(这个我们已经讲过了)

上面代码行中较慢的部分是将 SQL return 转换为 pandas 数据帧。考虑到 Python 的默认行为,此步骤不仅速度慢而且是单线程的。

要解决此问题,一种强制处理的方法是在单独的进程中发送 x 个子查询。

一旦我们有了子查询的结果,通过 pd.concat 组装单个数据帧实际上很快。

由于您正在研究并行化任务,请考虑以下 "distributed computing" 库:

如果您愿意将另一个库添加到您的依赖项列表中,那么所有这些都使您能够通过更多的自动化来并行执行任务。

另一种方法是在 Python 内核本身中使用多进程功能。