Медленная загрузка таблицы SQL Server в pandas DataFrame

Pandas становится смехотворно медленным при загрузке более 10 миллионов записей из базы данных SQL Server с использованием pyodbc и, в основном, функции pandas.read_sql(query,pyodbc_conn). Следующий код загружает 10-15 миллионов записей из таблицы SQL за 40-45 минут: Table1

Есть ли лучший и более быстрый способ чтения таблицы SQL в 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

person Anjana Shivangi    schedule 19.11.2018    source источник
comment
проверить с куском   -  person BENY    schedule 20.11.2018
comment
rows = cursor.execute("select * from Table1").fetchall() занимает такое же количество времени?   -  person Gord Thompson    schedule 20.11.2018
comment
Чанк @WB не помогает решить проблему со временем. Все равно много времени уходит на чтение.   -  person Anjana Shivangi    schedule 26.11.2018
comment
@GordThompson Спасибо. Я попытался использовать execute(), и fetchall() занимает приличное количество времени, чтобы прочитать объект курсора pyodbc, но требует вечности, чтобы преобразовать его в pandas Dataframe. См. ссылку.   -  person Anjana Shivangi    schedule 26.11.2018


Ответы (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.

person Sai Praneeth    schedule 25.02.2019