2011-09-23 66 views
2

我最近加入了一家新公司,剛剛接觸python(他們的首選腳本語言),並一直在使用cx_oracle創建一些ETL過程。到目前爲止,我構建的腳本都是單線程作業,它們從Oracle源數據庫中選擇需要的列的子集,並將輸出寫入命名管道,其中外部進程正在等待讀取該數據並將其插入到目標中。在cx-oracle中並行執行

這工作得很好,直到我得到一些在5億-2億行範圍內的表格。這項工作仍然有效,但需要數小時才能完成。這些大的源表是分區的,所以我一直在研究如何協調不同分區的並行讀取,以便我可以同時獲得兩個或更多線程,每個線程都寫入一個單獨的命名管道。

在cx-oracle中是否有一種優雅的方式來處理從同一個表的不同分區讀取多個線程?

這是我目前的(簡單)的代碼:

import cx_Oracle 
import csv 

# connect via SQL*Net string or by each segment in a separate argument 
connection = cx_Oracle.connect("user/[email protected]") 


csv.register_dialect('pipe_delimited', escapechar='\\' delimiter='|',quoting=csv.QUOTE_NONE) 

cursor = connection.cursor() 
f = open("<path_to_named_pipe>", "w") 

writer = csv.writer(f, dialect='pipe_delimited', lineterminator="\n") 
r = cursor.execute("""SELECT <column_list> from <SOURCE_TABLE>""") 
for row in cursor: 
     writer.writerow(row) 
f.close() 

我的一些源表中有超過1000個分區,以便硬編碼的分區名稱中是不是更好的選擇。我一直在考慮設置分區名稱陣列並迭代它們,但如果人們有其他想法,我很樂意聽到他們的意見。

+0

在一個相關的問題中,有幾個選項可以在python中並行執行任務。我的問題涉及I/O繁重的任務,它們不需要在它們之間來回傳遞數據。會**線程**,**多進程**,**子進程**或其他最合適的? –

回答

1

首先,您需要確保* cx_Oracle *是線程安全的。由於它實現了Python DB API Spec v2.0,所以您只需檢查threadsafety模塊全局。 值23表示您可以打開到數據庫的多個連接並同時運行多個查詢。最好的方法是使用threading模塊,它非常易於使用。 This是一篇關於如何開始使用它的簡短而甜美的文章。

當然,不能保證流水線查詢會帶來顯着的性能提升(數據庫引擎,I/O等原因),但絕對值得一試。祝你好運!

+0

謝謝你。我知道cx_Oracle的threadsafety爲2.它可以完成...只需要找出最好的方法來做到這一點。 –