Другим вариантом может быть использование модуля 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)
Вероятно, более хорошие способы сделать это (и не были должным образом проверены и т. Д.). Интересно узнать, как это происходит, если вы попробуете