Я недавно присоединился к новой компании и являюсь новичком в python (их предпочитаемый язык сценариев) и работаю с cx_oracle для создания некоторых процессов ETL. Сценарии, которые я создал до сих пор, были однопоточными заданиями, которые выбирают подмножество нужных мне столбцов из исходной БД Oracle и записывают вывод в именованный канал, где внешний процесс ожидает чтения этих данных и вставки их в целевой объект. .
Это работало нормально, пока я не доберусь до некоторых таблиц, которые находятся в диапазоне строк от 500 млн -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/password@TNS")
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 разделов, поэтому жесткое кодирование имен разделов не является предпочтительным вариантом. Я думал о настройке массивов имен разделов и их переборе, но если у людей есть другие идеи, я бы хотел их услышать.