Совместное использование курсора cx_Oracle между потоками или процессами - PullRequest
0 голосов
/ 01 марта 2019

У меня есть база данных в Oracle.Мне нужно экспортировать некоторые данные, обработать их и сохранить данные в файл.В таблице есть oracle sdo_geom , и мне нужно преобразовать геометрию в формат WKT .Геометрия действительно большая, большие полигоны с тысячами вершин.Я использую функцию SDO_UTIL.TO_WKTGEOMETRY () , но это занимает слишком много времени.Выбор (преобразование геометрии) в базу данных является узким местом в этом случае.

Я думаю о многопоточности или многопроцессорности в Python.Сценарий должен выглядеть примерно так:

  1. Создать соединение с базой данных
  2. Создать cx_Oracle.cursor
  3. Затем запустить несколько потоков или процессов, совместно использующих курсор
  4. В каждом потоке (или процессе) я буду выбирать данные из базы данных (той же таблицы) по блокам
  5. Затем все данные будут отправляться потоку или процессу, ответственному за обработку данных исохранение в файл

Я выбираю данные, используя fetchmany() через чанки:

def get_row_chunks(self):
    while True:
        rows = self.cursor.fetchmany()
        if not rows:
            break
        yield rows

Поэтому мой вопрос, возможно ли решить эту проблему, используямногопоточность или многопроцессорность и как (используя cx_Oracle ) или psycopg2 для PostgreSQL Я думаю, это не имеет значения.Я думаю, что курсор в этих библиотеках ведет себя одинаково.Или это не возможно легко разделить курсор между потоками или процессами.

Возможным решением будет переопределение геометрии WKT в базе данных, но это выглядит для меня более общим решением.

1 Ответ

0 голосов
/ 02 марта 2019

Вы не можете одновременно выполнять более одного действия с курсором или соединением в cx_Oracle.Так что вы не можете делать одновременные выборки, например.Если вы попытаетесь сделать это, вы обнаружите, что выборки блокируются.Таким образом, я бы посоветовал вам просто выполнить выборку в одном потоке и передать данные, извлеченные из другого потока или потоков для обработки.

Другая возможность заключается в создании пула, который позволяет создавать несколько соединений.и используйте их в нескольких потоках (используйте параметр threadaded = True при создании пула).Затем вы можете использовать каждое соединение для запроса другой части данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...