Ett annat alternativ kan vara att använda multiprocessing
modul, delar upp frågan och skickar den till flera parallella processer och sammanfogar sedan resultaten.
Utan att veta mycket om pandas
chunking - jag tror att du måste göra chunking manuellt (vilket beror på data)... Använd inte LIMIT / OFFSET - prestanda skulle vara fruktansvärt.
Detta kanske inte är en bra idé, beroende på data. Om det finns ett användbart sätt att dela upp frågan (t.ex. om det är en tidsserie, eller det finns någon form av lämplig indexkolumn att använda, kan det vara vettigt). Jag har lagt in två exempel nedan för att visa olika fall.
Exempel 1
import pandas as pd
import MySQLdb
def worker(y):
#where y is value in an indexed column, e.g. a category
connection = MySQLdb.connect(user='xxx', password='xxx', database='xxx', host='xxx')
query = "SELECT * FROM example_table WHERE col_x = {0}".format(y)
return pd.read_sql(query, connection)
p = multiprocessing.Pool(processes=10)
#(or however many process you want to allocate)
data = p.map(worker, [y for y in col_x_categories])
#assuming there is a reasonable number of categories in an indexed col_x
p.close()
results = pd.concat(data)
Exempel 2
import pandas as pd
import MySQLdb
import datetime
def worker(a,b):
#where a and b are timestamps
connection = MySQLdb.connect(user='xxx', password='xxx', database='xxx', host='xxx')
query = "SELECT * FROM example_table WHERE x >= {0} AND x < {1}".format(a,b)
return pd.read_sql(query, connection)
p = multiprocessing.Pool(processes=10)
#(or however many process you want to allocate)
date_range = pd.date_range(start=d1, end=d2, freq="A-JAN")
# this arbitrary here, and will depend on your data /knowing your data before hand (ie. d1, d2 and an appropriate freq to use)
date_pairs = list(zip(date_range, date_range[1:]))
data = p.map(worker, date_pairs)
p.close()
results = pd.concat(data)
Förmodligen trevligare sätt att göra detta på (och inte har testat ordentligt etc). Var intresserad av att veta hur det går om du provar det.