Параллельное выполнение в cx-oracle - PullRequest
2 голосов
/ 23 сентября 2011

Я недавно присоединился к новой компании и являюсь новичком в 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 разделов, поэтому жесткое кодирование имен разделов не является предпочтительным вариантом. Я думал о настройке массивов имен разделов и их переборе, но если у людей есть другие идеи, я бы хотел их услышать.

1 Ответ

1 голос
/ 23 сентября 2011

Прежде всего, вам необходимо убедиться, что * cx_Oracle * является поточно-ориентированным. Поскольку он реализует спецификацию Python DB API v2.0 , все, что вам нужно сделать, это проверить глобальный модуль threadsafety. Значения 2 или 3 означают, что вы можете открыть несколько подключений к БД и выполнить несколько запросов одновременно. Лучший способ сделать это - использовать модуль threading , который довольно прост в использовании. Это - короткая и приятная статья о том, как начать работу с ней.

Конечно, нет никаких гарантий, что конвейерная обработка ваших запросов приведет к значительному увеличению производительности (механизм БД, операции ввода-вывода и т. Д.), Но это определенно стоит попробовать. Удачи!

...