Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Najszybszy sposób na odczytanie ogromnej tabeli MySQL w Pythonie

Inną opcją może być użycie multiprocessing moduł, dzieląc zapytanie i wysyłając je do wielu równoległych procesów, a następnie łącząc wyniki.

Nie wiedząc zbyt wiele o pandas chunking - myślę, że trzeba by wykonać chunking ręcznie (co zależy od danych)... Nie używaj LIMIT / OFFSET - wydajność byłaby straszna.

To może nie być dobry pomysł, w zależności od danych. Jeśli istnieje użyteczny sposób na podzielenie zapytania (np. jeśli jest to seria czasowa lub istnieje jakaś odpowiednia kolumna indeksu do użycia, może to mieć sens). Poniżej umieściłem dwa przykłady, aby pokazać różne przypadki.

Przykład 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) 

Przykład 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)

Prawdopodobnie ładniejsze sposoby na robienie tego (i nie zostały odpowiednio przetestowane itp.). Jeśli spróbujesz, zainteresuj się, jak to działa.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mysql :Funkcja agregacji nie działa bez grupowania według

  2. 3 sposoby na znalezienie wierszy zawierających małe litery w MySQL

  3. Jak uruchomić serwer MySQL z wiersza poleceń w systemie Mac OS Lion?

  4. Jak mogę poprawić błąd ładowania MySQL?

  5. MySQL GROUP BY i wypełnianie pustych wierszy