Друга възможност може да е да използвате multiprocessing
модул, като разделя заявката и я изпраща до множество паралелни процеси, след което обединява резултатите.
Без да знам много за pandas
нарязване на парчета - мисля, че ще трябва да правите накъсването ръчно (което зависи от данните)... Не използвайте LIMIT / OFFSET - производителността би била ужасна.
Това може да не е добра идея, в зависимост от данните. Ако има полезен начин за разделяне на заявката (например, ако това е времева поредица или има някакъв вид подходяща индексна колона, която да се използва, може да има смисъл). Поставих два примера по-долу, за да покажа различни случаи.
Пример 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)
Пример 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)
Вероятно по-хубави начини за това (и не са тествани правилно и т.н.). Интересувайте се да разберете как става, ако го опитате.