sql >> Database teknologi >  >> RDS >> Mysql

Hurtigste måde at læse stor MySQL-tabel i python

En anden mulighed kan være at bruge multiprocessing modul, opdeler forespørgslen og sender den til flere parallelle processer, hvorefter resultaterne sammenkædes.

Uden at vide meget om pandas chunking - jeg tror, ​​du bliver nødt til at foretage chunking manuelt (hvilket afhænger af dataene)... Brug ikke LIMIT / OFFSET - ydeevne ville være forfærdelig.

Dette er muligvis ikke en god idé, afhængigt af dataene. Hvis der er en nyttig måde at opdele forespørgslen på (f.eks. hvis det er en tidsserie, eller der er en form for passende indekskolonne at bruge, kan det give mening). Jeg har indsat to eksempler nedenfor for at vise forskellige tilfælde.

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

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

Sandsynligvis pænere måder at gøre dette på (og ikke har testet ordentligt osv.). Vær interesseret i at vide, hvordan det går, hvis du prøver det.



  1. Få den genererede uuid efter indsættelse af php

  2. Hvordan kan jeg konvertere denne SQL-sætning til Django QuerySet?

  3. Laravel Eloquent vælg alle rækker med max created_at

  4. Få den næsthøjeste værdi i en MySQL-tabel