Mysql
 sql >> Base de données >  >> RDS >> Mysql

Le moyen le plus rapide de lire une énorme table MySQL en python

Une autre option pourrait être d'utiliser le multiprocessing module, en divisant la requête et en l'envoyant à plusieurs processus parallèles, puis en concaténant les résultats.

Sans trop connaître les pandas segmentation - je pense que vous devriez faire la segmentation manuellement (ce qui dépend des données)... N'utilisez pas LIMIT / OFFSET - les performances seraient terribles.

Cela pourrait ne pas être une bonne idée, selon les données. S'il existe un moyen utile de diviser la requête (par exemple, s'il s'agit d'une série chronologique ou d'une sorte de colonne d'index appropriée à utiliser, cela peut avoir un sens). J'ai mis deux exemples ci-dessous pour montrer différents cas.

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

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

Probablement de meilleures façons de faire cela (et n'ont pas été correctement testés, etc.). Soyez intéressé de savoir comment ça se passe si vous l'essayez.