2015-08-21 12 views
8

Attualmente sto interrogando i dati in dataframe tramite il comando pandas.io.sql.read_sql(). Volevo parallelizzare le chiamate simile a quello che questi ragazzi è a favore: (Embarrassingly parallel database calls with Python (PyData Paris 2015))Parallelizzazione chiamate database database Pyodbc pandas

Qualcosa di simile (molto generale):

pools = [ThreadedConnectionPool(1,20,dsn=d) for d in dsns] 
connections = [pool.getconn() for pool in pools] 
parallel_connection = ParallelConnection(connections) 
pandas_cursor = parallel_connection.cursor() 
pandas_cursor.execute(my_query) 

è qualcosa di simile possibile?

+0

qual è il tipo di database SQL e il driver, e supportano le chiamate multi-thread? – denfromufa

+1

utilizza MS sql server, supporta le chiamate multi-thread – user1129988

+0

non è sicuro di pyodbc, ma dal 2013 pymssql sembra essere thread-safe per multi-threading: http://pymssql.org/en/latest/changelog.html? evidenziare = filettatura – denfromufa

risposta

1

Sì, questo dovrebbe funzionare, anche se con l'avvertimento che dovrai cambiare parallel_connection.py in quella conversazione che fai sul sito. In quel codice c'è una funzione fetchall che esegue ciascuno dei cursori in parallelo, quindi combina i risultati. Questo è il cuore di quello che ti cambia:

vecchio Codice:

def fetchall(self): 
    results = [None] * len(self.cursors) 
    def do_work(index, cursor): 
     results[index] = cursor.fetchall() 
    self._do_parallel(do_work) 
    return list(chain(*[rs for rs in results])) 

Nuovo Codice:

def fetchall(self): 
    results = [None] * len(self.sql_connections) 
    def do_work(index, sql_connection): 
     sql, conn = sql_connection # Store tuple of sql/conn instead of cursor 
     results[index] = pd.read_sql(sql, conn) 
    self._do_parallel(do_work) 
    return pd.DataFrame().append([rs for rs in results]) 

Repo: https://github.com/godatadriven/ParallelConnection

Problemi correlati