Otra opción podría ser usar el multiprocessing
módulo, dividiendo la consulta y enviándola a múltiples procesos paralelos, luego concatenando los resultados.
Sin saber mucho de pandas
fragmentación:creo que tendría que hacer la fragmentación manualmente (que depende de los datos)... No use LIMIT / OFFSET:el rendimiento sería terrible.
Esto podría no ser una buena idea, dependiendo de los datos. Si hay una forma útil de dividir la consulta (por ejemplo, si es una serie de tiempo, o si hay algún tipo de columna de índice apropiada para usar, podría tener sentido). He puesto dos ejemplos a continuación para mostrar diferentes casos.
Ejemplo 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)
Ejemplo 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)
Probablemente mejores formas de hacer esto (y no se han probado correctamente, etc.). Interesa saber cómo te va si lo pruebas.