Een andere optie zou kunnen zijn om de multiprocessing
. te gebruiken module, de query opsplitsen en naar meerdere parallelle processen sturen, waarna de resultaten worden samengevoegd.
Zonder veel te weten over pandas
chunking - ik denk dat je de chunking handmatig zou moeten doen (wat afhangt van de gegevens)... Gebruik geen LIMIT / OFFSET - de prestaties zouden verschrikkelijk zijn.
Dit is misschien geen goed idee, afhankelijk van de gegevens. Als er een handige manier is om de query op te splitsen (bijvoorbeeld als het een tijdreeks is, of als er een soort geschikte indexkolom is om te gebruiken, kan dit logisch zijn). Ik heb hieronder twee voorbeelden gegeven om verschillende gevallen te laten zien.
Voorbeeld 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)
Voorbeeld 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)
Waarschijnlijk leukere manieren om dit te doen (en niet goed getest enz.). Wees geïnteresseerd om te weten hoe het gaat als je het probeert.