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

Hurtigste måde at indlæse numeriske data i python/pandas/numpy array fra MySQL

"Problemet" ser ud til at have været typekonverteringen, der sker fra MySQL's decimaltype til pythons decimal.Decimal, som MySQLdb, pymysql og pyodbc gør på dataene. Ved at ændre filen converters.py (på de allersidste linjer) i MySQLdb til at have:

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

i stedet for decimal.Decimal ser ud til at løse problemet fuldstændigt og nu følgende kode:

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)

Kører på mindre end et sekund! Hvad er sjovt, decimal. Decimal så aldrig ud til at være problemet i profileren.

Lignende løsning burde virke i pymysql-pakken. pyodbc er mere tricky:det hele er skrevet i C++, så du bliver nødt til at omkompilere hele pakken.

OPDATERING

Her er en løsning, der ikke kræver at ændre MySQLdb-kildekoden:Python MySQLdb returnerer datetime.date og decimal Løsningen så til at indlæse numeriske data i pandaer:

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)

Slår MATLAB med en faktor på ~4 ved indlæsning af 200k x 9 bord!



  1. MySQL, bedre at indsætte NULL eller tom streng?

  2. Konverter dato fra åååå-mm-dd til dd månedsnavn år

  3. Postgres:FEJL:cachelagret plan må ikke ændre resultattype

  4. Tilslutning til lokal SQL Server-database ved hjælp af C#