sql >> データベース >  >> RDS >> Mysql

MySQLからpython/pandas/numpy配列に数値データをロードする最速の方法

    「問題」は、MySQLのdecimal型からpythonのdecimal.Decimalに発生する型変換であるように思われます。これは、MySQLdb、pymysql、およびpyodbcがデータに対して行うものです。 MySQLdbのconverters.pyファイル(最後の行)を次のように変更します。

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

    10進数の代わりに。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)
    

    1秒未満で実行されます!おかしいのは10進数です。10進数がプロファイラーの問題であるようには見えませんでした。

    同様のソリューションがpymysqlパッケージで機能するはずです。 pyodbcはもっと注意が必要です。すべてC++で記述されているため、パッケージ全体を再コンパイルする必要があります。

    更新

    MySQLdbのソースコードを変更する必要のないソリューションは次のとおりです。PythonMySQLdbはdatetime.dateとdecimalを返します 次に、数値データをパンダにロードするソリューション:

    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)
    

    200k x 9テーブルの読み込みでMATLABを最大4倍上回ります!



    1. 列数は行の値数と一致しませんが、一致します

    2. Mysqlサービスがありません

    3. MySQLダイナミックピボット

    4. Where句に応じてSQLServerクエリがタイムアウトする