sql >> Databáze >  >> RDS >> Mysql

Nejrychlejší způsob, jak načíst číselná data do pole python/pandas/numpy z MySQL

Zdá se, že „problémem“ byla konverze typu, ke které dochází z desetinného typu MySQL na desetinné v pythonu. Desítkové, které na datech provádí MySQLdb, pymysql a pyodbc. Změnou souboru converters.py (na úplně posledních řádcích) v MySQLdb na:

conversions[FIELD_TYPE.DECIMAL] = float
conversions[FIELD_TYPE.NEWDECIMAL] = float

místo decimal.Decimal problém zcela vyřeší a nyní následující kód:

import MySQLdb
import numpy
import time

t = time.time()
conn = MySQLdb.connect(host='',...)
curs = conn.cursor()
curs.execute("select x,y from TABLENAME")
data = numpy.array(curs.fetchall(),dtype=float)
print(time.time()-t)

Běží za méně než sekundu! Co je legrační, desetinné. Desetinná soustava se v profilovači nikdy nezdála být problémem.

Podobné řešení by mělo fungovat v balíčku pymysql. pyodbc je složitější:vše je napsáno v C++, takže byste museli překompilovat celý balíček.

AKTUALIZACE

Zde je řešení, které nevyžaduje úpravu zdrojového kódu MySQLdb:Python MySQLdb vrací datetime.date a decimal Řešení pak načíst číselná data do pand:

import MySQLdb
import pandas.io.sql as psql
from MySQLdb.converters import conversions
from MySQLdb.constants import FIELD_TYPE

conversions[FIELD_TYPE.DECIMAL] = float
conversions[FIELD_TYPE.NEWDECIMAL] = float
conn = MySQLdb.connect(host='',user='',passwd='',db='')
sql = "select * from NUMERICTABLE"
df = psql.read_frame(sql, conn)

Poráží MATLAB faktorem ~4 při načítání stolu 200k x 9!



  1. MySQL Workbench zobrazuje výsledky jako BLOB

  2. Nasazení databáze z ovládání zdroje

  3. Použití OR v LIKE Query v MySQL k porovnání více polí

  4. Změňte formát data pro aktuální relaci na serveru SQL Server