Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Maneira mais rápida de ler enorme tabela MySQL em python


Outra opção pode ser usar o multiprocessing módulo, dividindo a consulta e enviando-a para vários processos paralelos e, em seguida, concatenando os resultados.

Sem saber muito sobre pandas chunking - acho que você teria que fazer o chunking manualmente (o que depende dos dados)... Não use LIMIT / OFFSET - o desempenho seria terrível.

Isso pode não ser uma boa ideia, dependendo dos dados. Se houver uma maneira útil de dividir a consulta (por exemplo, se for uma série temporal ou se houver algum tipo de coluna de índice apropriada para usar, pode fazer sentido). Eu coloquei dois exemplos abaixo para mostrar casos diferentes.

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

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

Provavelmente maneiras mais agradáveis ​​de fazer isso (e não testaram adequadamente etc). Fique interessado em saber como é se você tentar.