【问题标题】:Slow loading SQL Server table into pandas DataFrame将 SQL Server 表缓慢加载到 pandas DataFrame 中
【发布时间】:2019-04-22 06:50:36
【问题描述】:

当使用 pyodbc 并且主要是函数 pandas.read_sql(query,pyodbc_conn) 从 SQL Server DB 加载超过 1000 万条记录时,Pandas 变得异常缓慢。以下代码最多需要 40-45 分钟才能从 SQL 表中加载 10-15 百万条记录:Table1

有没有更好更快的方法将SQL Table读入pandas Dataframe?

import pyodbc
import pandas

server = <server_ip> 
database = <db_name> 
username = <db_user> 
password = <password> 
port='1443'
conn = pyodbc.connect('DRIVER={SQL Server};SERVER='+server+';PORT='+port+';DATABASE='+database+';UID='+username+';PWD='+ password)
cursor = conn.cursor()

data = pandas.read_sql("select * from Table1", conn) #Takes about 40-45 minutes to complete

【问题讨论】:

  • 检查块
  • rows = cursor.execute("select * from Table1").fetchall() 是否需要类似的时间?
  • @W-B 块对时间问题没有帮助。阅读仍然需要很多时间。
  • @GordThompson 谢谢。我尝试使用 execute() 和 fetchall() 需要相当长的时间来读取 pyodbc 游标对象,但需要永远将其转换为 pandas Dataframe。请看link

标签: python sql-server pandas pyodbc


【解决方案1】:

我遇到了同样的问题,行数更多,~50 M 最后编写了一个 SQL 查询并将它们存储为 .h5 文件。

sql_reader = pd.read_sql("select * from table_a", con, chunksize=10**5)

hdf_fn = '/path/to/result.h5'
hdf_key = 'my_huge_df'
store = pd.HDFStore(hdf_fn)
cols_to_index = [<LIST OF COLUMNS THAT WE WANT TO INDEX in HDF5 FILE>]

for chunk in sql_reader:
    store.append(hdf_key, chunk, data_columns=cols_to_index, index=False)

# index data columns in HDFStore
store.create_table_index(hdf_key, columns=cols_to_index, optlevel=9, kind='full')
store.close()

这样,我们将能够比 Pandas.read_csv 更快地读取它们

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 2018-04-04
    相关资源
    最近更新 更多