sql >> Database >  >> RDS >> Mysql

Snelste manier om enorme MySQL-tabel in python te lezen

Een andere optie zou kunnen zijn om de multiprocessing . te gebruiken module, de query opsplitsen en naar meerdere parallelle processen sturen, waarna de resultaten worden samengevoegd.

Zonder veel te weten over pandas chunking - ik denk dat je de chunking handmatig zou moeten doen (wat afhangt van de gegevens)... Gebruik geen LIMIT / OFFSET - de prestaties zouden verschrikkelijk zijn.

Dit is misschien geen goed idee, afhankelijk van de gegevens. Als er een handige manier is om de query op te splitsen (bijvoorbeeld als het een tijdreeks is, of als er een soort geschikte indexkolom is om te gebruiken, kan dit logisch zijn). Ik heb hieronder twee voorbeelden gegeven om verschillende gevallen te laten zien.

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

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

Waarschijnlijk leukere manieren om dit te doen (en niet goed getest enz.). Wees geïnteresseerd om te weten hoe het gaat als je het probeert.



  1. Berekening van de gemiddelde voorraadkosten in SQL

  2. Resultaten uit verschillende categorieën mixen, gerangschikt op score in MySQL

  3. Hoe kan ik een lijst maken Array met de cursorgegevens in Android

  4. wat is de melding:resource id#9?