Pilihan lain mungkin menggunakan multiprocessing
modul, membagi kueri dan mengirimkannya ke beberapa proses paralel, lalu menggabungkan hasilnya.
Tanpa mengetahui banyak tentang pandas
chunking - Saya pikir Anda harus melakukan chunking secara manual (yang tergantung pada data)... Jangan gunakan LIMIT / OFFSET - kinerja akan buruk.
Ini mungkin bukan ide yang baik, tergantung pada datanya. Jika ada cara yang berguna untuk membagi kueri (misalnya jika itu adalah rangkaian waktu, atau ada semacam kolom indeks yang sesuai untuk digunakan, mungkin masuk akal). Saya telah memasukkan dua contoh di bawah ini untuk menunjukkan kasus yang berbeda.
Contoh 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)
Contoh 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)
Mungkin cara yang lebih baik melakukan ini (dan belum diuji dengan benar, dll). Tertarik untuk mengetahui bagaimana kelanjutannya jika Anda mencobanya.