Một tùy chọn khác có thể là sử dụng multiprocessing
mô-đun, chia truy vấn lên và gửi nó đến nhiều quy trình song song, sau đó nối kết quả.
Nếu không biết nhiều về pandas
phân khúc - tôi nghĩ rằng bạn sẽ phải thực hiện phân khúc theo cách thủ công (điều này phụ thuộc vào dữ liệu) ... Không sử dụng LIMIT / OFFSET - hiệu suất sẽ rất tệ.
Đây có thể không phải là một ý tưởng hay, tùy thuộc vào dữ liệu. Nếu có một cách hữu ích để chia nhỏ truy vấn (ví dụ:nếu đó là thời gian hoặc có một số loại cột chỉ mục thích hợp để sử dụng, thì nó có thể có ý nghĩa). Tôi đã đưa ra hai ví dụ dưới đây để chỉ ra các trường hợp khác nhau.
Ví dụ 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)
Ví dụ 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)
Có lẽ là những cách tốt hơn để làm điều này (và chưa được kiểm tra đúng cách, v.v.). Hãy quan tâm để biết nó diễn ra như thế nào nếu bạn thử nó.