2016-10-14 366 views
0

私は3つの異なるMySQLテーブルからいくつかの列を3つの異なるデータフレームに読み込もうとしています。pandas read_sqlが異常に遅い

データベースから読み込むのに時間がかかりませんが、実際にデータフレームに入れるのはかなり遅いです。

start_time = time.time() 
print('Reading data from database...') 

from sqlalchemy import create_engine 
q_crash = 'SELECT <query string> FROM table1' 
q_vehicle = 'SELECT <query string> table2' 
q_person = 'SELECT <query string> FROM table3' 
engine = create_engine('mysql+pymysql://user:[email protected]:port/dbasename') 

print('Database time: {:.1f}'.format(time.time() - start_time)) 

crash = pd.read_sql_query(q_crash, engine) 
print('Read_sql time for table 1: {:.1f}'.format(time.time() - start_time)) 
vehicle = pd.read_sql_query(q_vehicle, engine) 
print('Read_sql time for table 2: {:.1f}'.format(time.time() - start_time)) 
person = pd.read_sql_query(q_person, engine) 
print('Read_sql time for table 3: {:.1f}'.format(time.time() - start_time)) 

出力:

Reading data from database... 
Database time: 0.0 
Read_sql time for table 1: 13.4 
Read_sql time for table 2: 30.9 
Read_sql time for table 3: 49.4 

はこの正常ですか?テーブルはかなり大きく、テーブル3は601,000以上の行です。しかし、パンダはread_csvを使うたびに大きなデータセットを処理しています。

+0

この表の中から読んでいますかビュー? – agold

+0

コマンドラインから、またはMySQLワークベンチのようなツール(Pythonスクリプトが実行されているのと同じマシンで実行されている)からクエリを実行すると、どのくらい時間がかかりますか? – scomes

+0

私はビューを作成したことは一度もなく、何も知らないので、テーブルから読んでいると仮定します。 @scomes、コマンドラインから同じクエリを実行すると、1秒未満で完了します。 – ale19

答えて

2

IMO完全なテーブルをPandas DFに読み込んだら、MySQL DBに持っていればそれほど意味がありません。なぜSQLを使ってデータをフィルタリングしたり結合したりしないのですか?あなたは本当にすべてのパンダスDFとしてそれらの3つのテーブルから行が必要ですか?

あなたがそれらを結合する場合は、最初のMySQL側でそれを行うと、単一のDFに結果セットを読み込むことができます...

のようなもの:

qry = 'select p.*, v.*, c.* from vehicle v join person p on v.id = p.vehicle_id join crash c on c.id = p.crash_id where <additional where clause>' 
df = pd.read_sql(qry, engine) 
関連する問題