En anden mulighed kan være at bruge multiprocessing
modul, opdeler forespørgslen og sender den til flere parallelle processer, hvorefter resultaterne sammenkædes.
Uden at vide meget om pandas
chunking - jeg tror, du bliver nødt til at foretage chunking manuelt (hvilket afhænger af dataene)... Brug ikke LIMIT / OFFSET - ydeevne ville være forfærdelig.
Dette er muligvis ikke en god idé, afhængigt af dataene. Hvis der er en nyttig måde at opdele forespørgslen på (f.eks. hvis det er en tidsserie, eller der er en form for passende indekskolonne at bruge, kan det give mening). Jeg har indsat to eksempler nedenfor for at vise forskellige tilfælde.
Eksempel 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)
Eksempel 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)
Sandsynligvis pænere måder at gøre dette på (og ikke har testet ordentligt osv.). Vær interesseret i at vide, hvordan det går, hvis du prøver det.