"Vấn đề" dường như là việc chuyển đổi kiểu xảy ra từ kiểu thập phân của MySQL sang kiểu thập phân của python. Thập phân mà MySQLdb, pymysql và pyodbc thực hiện trên dữ liệu. Bằng cách thay đổi tệp convertters.py (ở những dòng cuối cùng) trong MySQLdb để có:
conversions[FIELD_TYPE.DECIMAL] = float
conversions[FIELD_TYPE.NEWDECIMAL] = float
thay vì thập phân. thập phân dường như giải quyết hoàn toàn vấn đề và bây giờ là đoạn mã sau:
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)
Chạy trong vòng chưa đầy một giây! Thật buồn cười, số thập phân. Số thập phân dường như chưa bao giờ là vấn đề trong trình mô tả.
Giải pháp tương tự sẽ hoạt động trong gói pymysql. pyodbc phức tạp hơn:tất cả đều được viết bằng C ++, do đó bạn sẽ phải biên dịch lại toàn bộ gói.
CẬP NHẬT
Đây là một giải pháp không yêu cầu sửa đổi mã nguồn MySQLdb: Python MySQLdb trả về datetime.date và decimal Giải pháp sau đó để tải dữ liệu số vào gấu trúc:
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)
Đánh bại MATLAB với hệ số ~ 4 khi tải bảng 200k x 9!