2015-08-05 12 views
13

Questa è più una questione di comprensione che di programmazione. Sono abbastanza nuovo per Pandas e SQL. Sto usando i panda per leggere i dati da SQL con alcuni chunksize specifici. Quando eseguo una query sql ad es. panda di importazione come pdPandas SQL chunksize

df = pd.read_sql_query('select name, birthdate from table1', chunksize = 1000) 

Quello che non capisco è quando non me ne frega un chunksize, i dati vengono memorizzati nella memoria e posso vedere la memoria in crescita però, quando mi danno un chunksize l'utilizzo della memoria è non così in alto.

che ho è che questo DF ora contiene una serie di array di cui posso accedere come

for df_array in df: 
    print df.head(5) 

Quello che non capisco è qui se l'intero risultato della istruzione SQL viene mantenuto in IE memoria df è un oggetto che trasporta più array o se questi sono come puntatori rivolti verso una tabella temporanea creata dalla query SQL.

Sarei molto lieto di sviluppare una certa comprensione di come questo processo funzioni effettivamente.

risposta

18

Consideriamo due opzioni e ciò che accade in entrambi i casi:

  1. chunksize è Nessuno (valore predefinito):
    • panda passa query di database
    • banca dati esegue interrogazione
    • panda controlli e vede che chunksize è None
    • panda dice al database che vuole ricevere tutte le righe della tabella dei risultati in una volta
    • database restituisce tutte le righe della tabella dei risultati
    • panda memorizza la tabella dei risultati in memoria e lo avvolge in una cornice di dati
    • ora è possibile utilizzare la cornice di dati
  2. chunksize a non None:
    • panda passa query di database
    • banca dati esegue interrogazione
    • panda controlli e vede che pezzi ize ha un certo valore
    • panda crea un iteratore query (al solito 'mentre True' anello che si rompe quando il database dice che non ci sono più dati a sinistra) e itera su di esso ogni volta che si desidera che il prossimo pezzo della tabella dei risultati
    • panda dice database che si vuole ricevere le righe chunksize
    • database restituisce le righe successive chunksize dalla tabella dei risultati
    • panda memorizza le righe successive chunksize nella memoria e lo avvolge in una cornice di dati
    • ora è possibile utilizzare i dati frame

Per maggiori dettagli si può vedere il modulo pandas\io\sql.py, è ben documentato

14

Quando non si fornisce un chunksize, il risultato completo della query viene messo in una dataframe in una sola volta.

Quando si fornisce un valore chunksize, il valore di ritorno di read_sql_query è un iteratore di più dataset. Ciò significa che è possibile scorrere questo tipo:

for df in result: 
    print df 

e in ogni fase df è un dataframe (non una matrice!) Che contiene i dati di una parte della query. Vedere la documentazione su questo: http://pandas.pydata.org/pandas-docs/stable/io.html#querying

Per rispondere alla tua domanda per quanto riguarda la memoria, dovete sapere che ci sono due passaggi recupero dei dati dal database: execute e fetch.
Prima viene eseguita la query (result = con.execute()) e quindi i dati vengono recuperati da questo set di risultati come un elenco di tuple (data = result.fetch()). Durante il recupero è possibile specificare quante righe contemporaneamente si desidera recuperare. E questo è ciò che fa i panda quando fornisci un chunksize.
Tuttavia, molti driver di database hanno già messo tutti i dati in memoria nella fase di esecuzione, e non solo durante il recupero dei dati. Quindi, a tale riguardo, non dovrebbe importare molto per la memoria. A parte il fatto che la copia dei dati in un DataFrame avviene solo in fasi diverse mentre itera su chunksize.