簡體   English   中英

Python - 並行 SQL 查詢並返回每個數據幀

[英]Python - Parallel SQL Queries and return dataframes for each

所以我一直在研究 Python 中的多進程或並行進程來執行大約十幾個 SQL 查詢。 現在,查詢是串行完成的,大約需要 4 分鍾,其中 1 個查詢與其他 11 個查詢一樣長。 所以理論上,如果我可以並行運行所有查詢,我至少可以將總運行時間減少一半。

我正在嘗試按照以下方式做一些事情,但如果我目前的思維過程確實可行,我無法找到支持文檔:

所以,說我有:

SSMS_query1 = "SELECT * FROM TABLE1"

SSMS_query2 = "SELECT * FROM TABLE2"

HANADB_query3 = "SELECT * FROM TABLE3"

因此,要連接到 SSMS,我使用:

import pyodbc
server = "server_name"
cnxn = pyodbc.connect("DRIVER={SQL Server};SERVER=" + server + ";trusted_connection=Yes")

然后連接到我的HANAdb,我使用:

from hdbcli import dbapi
conn = dbapi.connect(address="", port=, user="", password="")

然后基本上我想做一些可以利用池來節省時間的事情,例如:

import pandas as pd
with cnxn, conn as ssms, hana:
    df1 = pd.read_sql(SSMS_query1, ssms)
    df2 = pd.read_sql(SSMS_query2, ssms)
    df3 = pd.read_sql(HANADB_query3, hana)

我試過使用:

import multiprocessing
import threading

但是我無法得到想要的 output,因為最終我想要 output df1、df2 和 df3 到 excel。 那么如何存儲數據幀並將它們用作 output 稍后使用並行性?

我認為多線程可能比不知道要創建的數據幀有多大的多處理更有效,因為通常使用多處理將結果從子進程移回主進程會有更多的開銷。 但由於查詢需要 4 分鍾,我不得不假設數據量相當大。 此外,大部分時間都花在了非常適合多線程的網絡活動上。

在這里,我假設最壞的情況是無法在線程之間共享數據庫連接。 如果不是這種情況,則只創建一個連接並將其用於所有提交的任務:

from multiprocessing.pool import ThreadPool
import time
import pandas as pd
import pyodbc

def run_sql(conn, sql):
    return pd.read_sql(sql, conn)

def main():
    SSMS_query1 = "SELECT * FROM TABLE1"
    SSMS_query2 = "SELECT * FROM TABLE2"
    HANADB_query3 = "SELECT * FROM TABLE3"
    
    queries = (SSMS_query1, SSMS_query2, HANADB_query3)
    n_queries = len(queries)

    server = "server_name"
    connections = [
        pyodbc.connect("DRIVER={SQL Server};SERVER=" + server + ";trusted_connection=Yes")
            for _ in range(n_queries)
    ]

    t0 = time.time()
    # One thread per query:
    with ThreadPool(n_queries) as pool:
        results = pool.starmap(run_sql, zip(connections, queries))    
        t1 = time.time()
        print(results)
        print(t1 - t0)

if __name__ == '__main__':
    main()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM