Eine andere Option könnte die Verwendung von multiprocessing
sein Modul, teilt die Abfrage auf, sendet sie an mehrere parallele Prozesse und verkettet dann die Ergebnisse.
Ohne viel über pandas
zu wissen Chunking - Ich denke, Sie müssten das Chunking manuell durchführen (was von den Daten abhängt) ... Verwenden Sie LIMIT / OFFSET nicht - die Leistung wäre schrecklich.
Abhängig von den Daten ist dies möglicherweise keine gute Idee. Wenn es eine nützliche Möglichkeit gibt, die Abfrage aufzuteilen (z. B. wenn es sich um eine Zeitreihe handelt oder eine geeignete Indexspalte verwendet werden soll, kann dies sinnvoll sein). Ich habe unten zwei Beispiele eingefügt, um verschiedene Fälle zu zeigen.
Beispiel 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)
Beispiel 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)
Wahrscheinlich schönere Möglichkeiten, dies zu tun (und nicht richtig getestet usw.). Seien Sie gespannt, wie es läuft, wenn Sie es versuchen.