Mysql
 sql >> база данни >  >> RDS >> Mysql

Най-бързият начин да прочетете огромна MySQL таблица в python

Друга възможност може да е да използвате multiprocessing модул, като разделя заявката и я изпраща до множество паралелни процеси, след което обединява резултатите.

Без да знам много за pandas нарязване на парчета - мисля, че ще трябва да правите накъсването ръчно (което зависи от данните)... Не използвайте LIMIT / OFFSET - производителността би била ужасна.

Това може да не е добра идея, в зависимост от данните. Ако има полезен начин за разделяне на заявката (например, ако това е времева поредица или има някакъв вид подходяща индексна колона, която да се използва, може да има смисъл). Поставих два примера по-долу, за да покажа различни случаи.

Пример 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) 

Пример 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)

Вероятно по-хубави начини за това (и не са тествани правилно и т.н.). Интересувайте се да разберете как става, ако го опитате.



  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 tinyint(1) срещу tinyint(2) срещу tinyint(3) срещу tinyint(4)

  2. Не мога да свържа Ruby on Rails към отдалечена база данни на mysql

  3. Определете дали даден sql израз започва с думата SELECT

  4. Ехо множество стойности със същото име на колона в същата таблица

  5. Записване на началото на сесията на 1 страница или на всички страници?