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

Най-бързият начин за зареждане на цифрови данни в python/pandas/numpy масив от MySQL

"Проблемът" изглежда е бил преобразуването на типа, което се случва от десетичния тип на MySQL в десетичния тип на python. Decimal, който MySQLdb, pymysql и pyodbc правят върху данните. Чрез промяна на файла converters.py (в последните редове) в MySQLdb да има:

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

вместо decimal.Decimal изглежда напълно решава проблема и сега следният код:

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)

Изпълнява се за по-малко от секунда! Какво е смешно, десетичният. Изглежда, че десетичният никога не е бил проблемът в профайлъра.

Подобно решение трябва да работи в пакета pymysql. pyodbc е по-сложен:всичко е написано на C++, следователно ще трябва да прекомпилирате целия пакет.

АКТУАЛИЗИРАНЕ

Ето решение, което не изисква промяна на изходния код на MySQLdb:Python MySQLdb връща datetime.date и decimal След това решението за зареждане на цифрови данни в pandas:

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)

Побеждава MATLAB с фактор ~4 при зареждане на таблица 200k x 9!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Изключение за счупена тръба в приложението Grails

  2. Как мога да използвам транзакции в моята MySQL съхранена процедура?

  3. Java, управляван от MySQL тригер

  4. MySQL - Не може да се добави или актуализира дъщерен ред:ограничение на външния ключ е неуспешно

  5. Не е намерен подходящ драйвер за 'jdbc:mysql://localhost:3306/mysql