Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Schnellste Möglichkeit, riesige MySQL-Tabellen in Python zu lesen

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.