Další možností může být použití multiprocessing
modul, rozdělí dotaz a odešle jej do více paralelních procesů a poté zřetězí výsledky.
Aniž bych toho moc věděl o pandas
chunking – myslím, že byste to chunking museli dělat ručně (což závisí na datech)... Nepoužívejte LIMIT / OFFSET – výkon by byl hrozný.
V závislosti na datech to nemusí být dobrý nápad. Pokud existuje užitečný způsob, jak rozdělit dotaz (např. pokud je to časová řada nebo existuje nějaký vhodný indexový sloupec, který lze použít, může to mít smysl). Níže jsem uvedl dva příklady pro znázornění různých případů.
Příklad 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)
Příklad 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)
Pravděpodobně hezčí způsoby, jak to udělat (a nebyly řádně testovány atd.). Zajímejte se, jak to jde, pokud to zkusíte.