Как обработать 10 миллионов записей в Oracle БД, используя Python. (cx_ Oracle / Pandas) - PullRequest
0 голосов
/ 14 марта 2020

Я попробовал cx_ Oracle package, fetchall (), но в итоге потреблялось много оперативной памяти, тоже попытался Pandas, но это также не кажется таким эффективным, если у нас есть миллиарды записей.

Мой вариант использования - Извлечь каждую строку из таблицы oracle в python, выполнить некоторую обработку и загрузить ее в другую таблицу. PS - Ожидая что-то вроде fetchmany (), попробовал это, но не смог заставить его работать.

Ответы [ 2 ]

1 голос
/ 14 марта 2020

С вашим большим набором данных, поскольку память вашего компьютера «слишком мала», вам придется выполнять пакетную обработку наборов строк и заново вставлять каждый набор перед извлечением следующего набора.

Настройка Cursor.arraysize будет иметь важное значение для вашей производительности извлечения. Это значение используется для размеров внутреннего буфера, независимо от того, используете ли вы fetchone() или fetchmany(). Используйте executemany() при повторной вставке значений, см. Выполнение пакетных операторов и массовая загрузка .

Большой вопрос, нужно ли вам вообще извлекать данные в Python, или можете ли вы выполнять манипуляции в PL / SQL или SQL - использование этих двух средств избавит от необходимости передавать данные по сети, поэтому будет намного, намного эффективнее.

0 голосов
/ 14 марта 2020

Обычно ваша стратегия должна быть следующей.

  1. Напишите запрос sql, который получит необходимые данные.
  2. Выполнить запрос
  3. l oop: прочитать кортеж из результата.
  4. Обработать кортеж.
  5. Записать обработанный материал в цель отношение

Множество деталей, с которыми необходимо разобраться.

Обычно при выполнении запроса этого времени вам нужно прочитать версию базы данных. Если у вас есть одновременная запись в одни и те же данные, вы получите устаревшую версию, но вы не задержите авторов. Если вам нужна самая последняя версия, вам нужно решить сложную проблему.

При выполнении шага 4 не открывайте новое соединение, используйте его повторно. Открытие нового соединения похоже на запуск линкора.

Лучше всего, если у вас нет индексов для целевого отношения, так как вы будете платить за обновление целевого отношения каждый раз, когда пишете кортеж. Это будет работать, но будет медленнее. Вы можете построить индекс после завершения обработки.

Если эта реализация слишком медленная для вас, простой способ ускорить процесс - это обработать, скажем, 1000 кортежей одновременно и записать их в пакетном режиме. Если это слишком медленно, вы попали в темный мир настройки производительности базы данных.

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