我最近加入了一家新公司,剛剛接觸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個分區,以便硬編碼的分區名稱中是不是更好的選擇。我一直在考慮設置分區名稱陣列並迭代它們,但如果人們有其他想法,我很樂意聽到他們的意見。
在一個相關的問題中,有幾個選項可以在python中並行執行任務。我的問題涉及I/O繁重的任務,它們不需要在它們之間來回傳遞數據。會**線程**,**多進程**,**子進程**或其他最合適的? –