试图找到将 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" 库:
- 任务:http://dask.pydata.org/en/latest/
- Distarray:http://docs.enthought.com/distarray/
- 雷:https://ray-project.github.io/2017/05/20/announcing-ray.html
如果您愿意将另一个库添加到您的依赖项列表中,那么所有这些都使您能够通过更多的自动化来并行执行任务。
另一种方法是在 Python 内核本身中使用多进程功能。
我正在尝试查询 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" 库:
- 任务:http://dask.pydata.org/en/latest/
- Distarray:http://docs.enthought.com/distarray/
- 雷:https://ray-project.github.io/2017/05/20/announcing-ray.html
如果您愿意将另一个库添加到您的依赖项列表中,那么所有这些都使您能够通过更多的自动化来并行执行任务。
另一种方法是在 Python 内核本身中使用多进程功能。