Une autre option pourrait être d'utiliser le multiprocessing
module, en divisant la requête et en l'envoyant à plusieurs processus parallèles, puis en concaténant les résultats.
Sans trop connaître les pandas
segmentation - je pense que vous devriez faire la segmentation manuellement (ce qui dépend des données)... N'utilisez pas LIMIT / OFFSET - les performances seraient terribles.
Cela pourrait ne pas être une bonne idée, selon les données. S'il existe un moyen utile de diviser la requête (par exemple, s'il s'agit d'une série chronologique ou d'une sorte de colonne d'index appropriée à utiliser, cela peut avoir un sens). J'ai mis deux exemples ci-dessous pour montrer différents cas.
Exemple 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)
Exemple 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)
Probablement de meilleures façons de faire cela (et n'ont pas été correctement testés, etc.). Soyez intéressé de savoir comment ça se passe si vous l'essayez.