2015-04-02 92 views
2

結果我有這樣迭代查詢從SQLAlchemy的

def foo(): 
local_session = Session() 
results = local_session.query(T.x, T.y, T.z, T.a, T.b, T.c 
, T.d, T.e, T.f, T.g, T.h, T.i, T.j, T.k, T.l 
, T.m, T.n, T.o, T.p, T.q, T.r, T.s, T.t, T.u 
, T.v, 
User.gender).join(User)\ 
.filter(T.language == 'en', T.where_i_am_from == 'US', 
User.some_num >= 0.9).limit(1000000) 

local_session.close() 
return results, results.count() 

查詢一個SQLAlchemy的查詢功能工作正常。 然後我把這個功能在這裏:

def fubar(): 

raw_data,raw_data_length = myModule.foo() 

df = pd.DataFrame() 
for each in raw_data: 

    df = df.append(pd.DataFrame({ #add each.x etc to df..... }} 


return df 

的問題是,它不會在「爲每個raw_data」循環迭代的時候我有一個.limit我foo的查詢5000以上,或使用。所有( )或沒有限制。該程序將掛起並且什麼都不做(0 cpu使用)。我已經在我的本地sql服務器和我的亞馬遜測試過這兩個。當我直接在數據庫上運行SQL時,我返回了大約800,000行。這是爲什麼發生?

我正在使用最新的mysql和最新的sqlalchemy。

+0

不是對你問題的回答,而是對問題的另一部分的評論:我不確定這是創建「DataFrame」的最佳方式。您可以嘗試使用'df = pd.read_sql(query.statement,query.session.bind)'來代替。 – van 2015-04-02 08:09:01

+0

我會嘗試用下面的'rows = results.all()\ n local_session.close()\ n cnt = len(rows)\ n返回行,cnt'替換你的'return ...'語句。我的猜測是它與會話狀態有關。 – van 2015-04-02 08:09:57

+0

謝謝。我會研究熊貓的方法。 – user2757902 2015-04-02 19:38:23

回答

1

這可能像MySQL驅動程序問題。我會按順序執行以下操作:

  1. 運行python -v標誌,如python -v yourprogram.py

這有可能向您顯示程序卡住的位置。

  1. 獲得這些800,000個結果,並將它們粘貼到SQLite中,並使用等效架構中的表。

這樣做相對便宜,所有你必須做的事情是改變SQA數據庫字符串。顯然,這會告訴你問題在於驅動程序還是代碼中。

  • 你做的兩班(TUser)之間的連接 - 渴望做負載,而不是默認的延遲加載。
  • 如果您有800,000行並進行了懶連接,那可能是一個問題。將joinedload(在SQLAlchemy的早期版本中爲eagerload)添加到options

    +0

    這是mysql的驅動程序。我正在使用Oracles MYSQL連接器,切換到pymysql,它的工作原理。 – user2757902 2015-04-02 19:37:48