sql >> Base de Datos >  >> RDS >> Mysql

La forma más rápida de leer una gran tabla de MySQL en python

Otra opción podría ser usar el multiprocessing módulo, dividiendo la consulta y enviándola a múltiples procesos paralelos, luego concatenando los resultados.

Sin saber mucho de pandas fragmentación:creo que tendría que hacer la fragmentación manualmente (que depende de los datos)... No use LIMIT / OFFSET:el rendimiento sería terrible.

Esto podría no ser una buena idea, dependiendo de los datos. Si hay una forma útil de dividir la consulta (por ejemplo, si es una serie de tiempo, o si hay algún tipo de columna de índice apropiada para usar, podría tener sentido). He puesto dos ejemplos a continuación para mostrar diferentes casos.

Ejemplo 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) 

Ejemplo 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)

Probablemente mejores formas de hacer esto (y no se han probado correctamente, etc.). Interesa saber cómo te va si lo pruebas.